我在承诺之后处理Promises时遇到了很多方面,在For..Loops内部调用了API,我的猜测是我开发了反模式的承诺。
这个确切的codepen说明了Promise的问题:
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以正确的顺序登录,似乎它永远无法解决..
另外,关于如何防止瀑布事物的任何提示? (我想只打印一次错误,而不是每个承诺调用一次)
修改
对于任何寻找解决方案的人,请查看@ jaromanda-x的解决方案:http://codepen.io/ghuroo/pen/pReLZm?editors=0010
答案 0 :(得分:2)
为了你的承诺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>';
});
};
答案 1 :(得分:1)
我通常更喜欢这样写:
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);
});