【问题标题】:Nightmare Promises with for..loop api calls, waterfall & anti-pattern (Bluebird.js) [duplicate]带有 for..loop api 调用、瀑布和反模式(Bluebird.js)的噩梦承诺 [重复]
【发布时间】:2017-01-20 12:38:00
【问题描述】:

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

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

【问题讨论】:

  • 有更多重复项,采用不同的方法,例如stackoverflow.com/questions/29546898/…。函数到read aboutPromise#eachPromise#mapPromise#mapSeriesPromise#reduce,他们都可以处理这些情况,每个人都擅长某个方面。

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


【解决方案1】:

为了你的承诺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>';
    });
};

【讨论】:

【解决方案2】:

我通常会这样写:

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

【讨论】:

  • 谢谢!您的 .catch() 是否适用于任何链式承诺中的任何拒绝?
  • 是的,他们都应该去那里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-15
  • 2012-06-26
  • 2016-11-11
  • 2017-03-27
  • 2019-08-11
相关资源
最近更新 更多