Nightmare Promises with for..loop api calls,waterfall&反模式(Bluebird.js)

时间:2017-01-20 12:38:00

标签: javascript for-loop promise anti-patterns waterfall

我在承诺之后处理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

2 个答案:

答案 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);
});