如何构建嵌套的Promise

我有一种情况,我认为我的唯一选择是在对方内嵌套一些承诺。 我有一个需要执行的Promise和一个方法,直到Promise完成为止。 像这样的东西:

let promise = new Promise((resolve, reject) => {

  // Do some stuff

});

doSomethingUntilPromiseisDone(promise);

但是,在我的Promise中,我需要执行另一个返回另一个Promise的方法:

let promise = new Promise((resolve, reject) => {

  fetchValue(url)
    .then((value) => {

      // Do something here

    }).catch((err) => {
      console.error(err);
    });

});

doSomethingUntilPromiseisDone(promise);

但是现在,在fetchValue方法的then语句中,我有另一个方法来执行它,猜猜看,返回另一个Promise:

let promise = new Promise((resolve, reject) => {

  fetchValue(url)
    .then((value) => {

      saveToCache(value)
        .then((success) => {

          console.log('success!!');
          resolve('success');

        });

    }).catch((err) => {
      console.error(err);
    });

});

doSomethingUntilPromiseisDone(promise);

所以最后,我有一个承诺,在一个承诺之内,在一个承诺之内。 有没有办法我可以更好地构建这个,这样它更直接? 似乎将它们嵌套在一起与Promise预期的链接方法相反。


使用.then()

let doStuff = (resolve, reject) => {/* resolve() or reject() */};
let promise = new Promise(doStuff);
doSomethingUntilPromiseisDone(
  promise 
  .then(value => fetchValue(url))
  .then(value => value.blob())
  .then(saveToCache)
)
.then(success => console.log("success!!"))
.catch(err => console.error(err))

您可以使用generator将您的嵌套承诺(Bluebird.couroutine或Generators)

//Bluebird.couroutine
const generator = Promise.coroutine(function*() {
  try {
     const value = yield fetchValue(url);
     const success = yield saveToCache(value);
     console.log('success:', success);
  } catch(e) {
     console.error(err);
  }    
}));

generator();
链接地址: http://www.djcxy.com/p/55481.html

上一篇: How to structure nested Promises

下一篇: Promise vs Observable