带有 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>';
    });
};