当前位置: 首页 > 知识库问答 >
问题:

迭代WinJSpromise数组,如果成功完成,则中断

越嘉茂
2023-03-14

我有3个WinJSpromise,我想按顺序调用,直到其中一个promise完成而没有错误。

伪代码:

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

当然,我不能使用数组中的每个。因为这将并行执行promise。

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

共有1个答案

谈禄
2023-03-14

基本上你要

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

或者如果你真的有一个promise数组(已经开始并行运行的任务):

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

(很像Promise.any,只是依次等待)

 类似资料:
  • 我有一个我正在使用的API,它每5秒钟接受一次呼叫,比它不会响应的任何时间都多。在每次调用中,它将在一批中接受5条记录。我有一个1000条记录的列表,我需要使用api来检查,所以我想做的是每5秒钟把我的记录列表分成5个批次发送给它。 我可以让它大部分工作,但我不能计算的一点是分解记录列表,这是一个成批数组,你知道怎么做吗? 这是我在下面使用的代码,但是它每5秒钟输出一次数组的每个单独部分,而不是每

  • 问题内容: 我正在尝试实现自动补全功能,但是找不到在Swift中可用的示例。下面,我打算转换Ray Wenderlich的自动完成教程 和2010年的示例代码。最后,代码进行了编译,但是没有显示包含可能完成的表格,而且我没有经验来了解为什么它未被隐藏shouldChangeCharactersInRange。 问题答案: 用下面的内容替换您的函数内容。希望对您有帮助。

  • 生成器迭代 手动迭代生成器,递归执行 AsyncTask::next,调用Generator::send方法将将yield值作为yield表达式结果。 yield表达式可能是一个异步调用,我们这里为之后把异步调用的结果作为yield表达式结果铺垫。 yield外侧括号在PHP5必须,PHP7不需要。 如, $ip = (yield async_dns_lookup(...) ); ^

  • 问题内容: 这是我在Swift(略作修改)中发布的遍历视图控制器层次结构的可能解决方案: 该方法应遍历父视图控制器层次结构,并返回给定类的第一个实例;如果未找到,则返回nil。 但这是行不通的,我也不知道为什么。标有的可选绑定 始终会成功执行 ,因此即使第一个父视图控制器不是的实例,也将返回它。 这很容易被复制:创建一个从在Xcode6通用的“iOS的主从应用程序”模板的项目,下面的代码添加到该的

  • 问题内容: 我有一个脚本,该脚本遍历包含要访问的URL:s并截取其屏幕截图的文本文件。 所有这一切都完成且简单。该脚本会初始化一个类,该类在运行时会创建列表中每个站点的屏幕快照。某些站点的加载时间非常非常长,而某些站点可能根本无法加载。因此,我想将函数包装在一个超时脚本中,以使该函数在10秒内无法完成时返回。 我对最简单的解决方案感到满意,也许设置一个异步计时器,无论函数内部实际发生什么,该计时器

  • 我查看了文档并找到了invokeAny ExecutorService,但这将返回任何已成功完成的线程的结果,而不一定是第一个线程。