如何构建嵌套的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