带有 for..loop api 调用、瀑布和反模式的噩梦承诺 (Bluebird.js)
Nightmare Promises with for..loop api calls, waterfall & anti-pattern (Bluebird.js)
我在处理 Promises after promises 时遇到很多方面的问题,API 在 For..Loops 内部调用,我猜我正在开发 promises 反模式。
这个确切的代码笔说明了我的 Promises 问题:
http://codepen.io/ghuroo/pen/EZWoGQ?editors=0010
代码示例:
$('#start').on('click', function() {
log('here we go: ');
promise1().then(function(success) {
log(success);
promise2().then(function(success) {
log(success);
promise3().then(function(success) {
log(success);
}).catch(function(error) { log(error); });
}).catch(function(error) { log(error); });
}).catch(function(error) { log(error); });
});
关于如何改进我的代码的任何帮助?
如您所见,我无法让 for..loop 以正确的顺序登录,似乎永远无法解决..
此外,关于如何防止瀑布事件的任何提示? (我只想打印一次错误,而不是每次 promise 调用都打印一次)
编辑:
对于寻找解决方案的任何人,这里是@jaromanda-x 的解决方案:http://codepen.io/ghuroo/pen/pReLZm?editors=0010
我通常是这样写的:
promise1()
.then(function (success) {
log(success);
return promise2();
})
.then(function (success) {
log(success);
return promise3();
})
.then(function (success) {
log(success);
})
.catch(function (error) {
log(error);
});
为了你的承诺3
function promise3() {
// NOTE: this function returns a function
function delay(value) {
return function() {
return new Promise(function(resolve) {
setTimeout(resolve, 500, value);
});
}
}
log('promise 3 started (takes 4*500ms = 2 seconds)');
var p = Promise.resolve();
for (i = 0; i < 4; i++) {
p = p.then(delay(i)).then(function(n) {
log('promise 3 - iteration nr. ' + n);
})
}
return p.then(function() {
return '<b>i\'m done 3</b>';
});
};
我在处理 Promises after promises 时遇到很多方面的问题,API 在 For..Loops 内部调用,我猜我正在开发 promises 反模式。
这个确切的代码笔说明了我的 Promises 问题:
http://codepen.io/ghuroo/pen/EZWoGQ?editors=0010
代码示例:
$('#start').on('click', function() {
log('here we go: ');
promise1().then(function(success) {
log(success);
promise2().then(function(success) {
log(success);
promise3().then(function(success) {
log(success);
}).catch(function(error) { log(error); });
}).catch(function(error) { log(error); });
}).catch(function(error) { log(error); });
});
关于如何改进我的代码的任何帮助? 如您所见,我无法让 for..loop 以正确的顺序登录,似乎永远无法解决..
此外,关于如何防止瀑布事件的任何提示? (我只想打印一次错误,而不是每次 promise 调用都打印一次)
编辑:
对于寻找解决方案的任何人,这里是@jaromanda-x 的解决方案:http://codepen.io/ghuroo/pen/pReLZm?editors=0010
我通常是这样写的:
promise1()
.then(function (success) {
log(success);
return promise2();
})
.then(function (success) {
log(success);
return promise3();
})
.then(function (success) {
log(success);
})
.catch(function (error) {
log(error);
});
为了你的承诺3
function promise3() {
// NOTE: this function returns a function
function delay(value) {
return function() {
return new Promise(function(resolve) {
setTimeout(resolve, 500, value);
});
}
}
log('promise 3 started (takes 4*500ms = 2 seconds)');
var p = Promise.resolve();
for (i = 0; i < 4; i++) {
p = p.then(delay(i)).then(function(n) {
log('promise 3 - iteration nr. ' + n);
})
}
return p.then(function() {
return '<b>i\'m done 3</b>';
});
};