【问题标题】:Iterate over array of WinJS Promises and break if one completed successful遍历 WinJS Promises 数组,如果一个成功完成则中断
【发布时间】:2015-02-10 00:16:04
【问题描述】:

我有 3 个 WinJS Promises,我想按顺序调用它们,直到一个完成且没有错误。

伪代码:

var promises = [promise1,promise2,promise3];
promises.each (promise)
  promise.then (result) return result

当然,我不能在数组上使用 .each,因为这会并行执行 Promise。

所以首先迭代应该是顺序的,如果promise返回错误,则应该尝试下一个promise,否则它应该返回成功promise的值。 如果没有 Promise 返回成功,那么整个循环应该指示失败。

【问题讨论】:

    标签: asynchronous promise winjs


    【解决方案1】:

    基本上你想要

    return promise1.catch(function(err) {
        return promise2.catch(function(err) {
            return promise3;
        });
    })
    

    或(展平)

    makePromise1().catch(makePromise2).catch(makePromise3);
    

    您可以使用reduce 轻松地从一组要尝试的函数动态创建此链:

    return promiseMakers.reduce(function(p, makeNext) {
        return p.then(null, makeNext);
    }, WinJS.Promise.wrapError());
    

    或者如果你真的有一系列的承诺(已经开始并行运行的任务):

    return promises.reduce(function(p, next) {
        return p.then(null, function(err) {
            return next;
        });
    }, WinJS.Promise.wrapError());
    

    (和Promise.any很像,只是顺序等待)

    【讨论】:

    • 请注意,promise 代表已经开始的事件,因此 OP 在任何有可能失败之前发出所有三个请求
    • 是的,这就是为什么我觉得奇怪的是 OP 有promises = [promise1,promise2,promise3]
    • 是的,你说得对,数组不应该包含承诺。它应该包含返回一个promise的函数。那么next 会变成next()
    • @philk:不,您只需将我的第一个 sn-p 与 makeNext 一起使用 :-) 但是,是的,调用 next() 将是等效的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多