1

在处理 Promises 之后的 Promises、For..Loops 内部的 API 调用时,我在很多方面都在苦苦挣扎,我的猜测是我正在开发 Promise 反模式。

这个确切的 codepen 说明了我对 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

4

2 回答 2

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>';
    });
};
于 2017-01-20T13:09:04.150 回答
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);
});
于 2017-01-20T12:58:38.320 回答