2017-06-29 181 views
0

在我的角度应用程序中,我使用承诺在我的服务中调用方法,但由于我需要多次调用它,因此我在for循环中调用它。多次呼叫承诺

for(let item of this.arrayName) 
{ 
    this.service.funcName(item.name).then(result => {     
     //handle result     
    }).catch(err => {     
     //handle error 
    }); 
} 

但是当从多个调用同时获得结果时会发生什么?承诺知道如何处理它?它是否分别处理每个结果? 还是我需要锁定代码? 在此先感谢。

+0

你不能“呼吁承诺”。您可以调用返回承诺的函数。每个调用将(可能)返回一个单独的承诺。 – 2017-06-29 12:30:40

回答

0

是的,承诺“知道”如何处理它。这是JavaScript的本质。 JavaScript事件循环在单个线程上运行,当IO操作(ajax,indexeddb,filesystem等)结束时,回调会附加到消息队列中,并由事件循环持续消耗。这样你就不必担心任何竞争条件。此外,ECMAScript规范经过精心设计,可以隐藏每个可能出现争用情况的地方。

这就是为什么您必须避免编写阻止代码的原因。如果你的代码被阻塞,整个EventLoop被阻塞。现在,使用JavaScript创建这样的拦截代码非常困难,但仍然不是不可能的。

Concurrency model and Event Loop on MDN

0

你在做什么是创建于this.arrayName每个项目的一个承诺。

这应该很好,只要每个项目的每个处理是完全独立的。但是你必须要小心的是,在promise被解决并且随后被处理之前,你的代码执行将继续超出for循环。所以你可能想继续等待所有的承诺完全解决。

你可以在东西做到这一点像下面这样:

Promise.all(this.arrayName.map(name => { 
    return this.service.funcName(name).then(result => {     
     //handle result     
    }).catch(err => {     
     //handle error 
    }); 
}) 
.then(...) // all success - do success case 
.catch(...) // some failed - handle error case 
0

什么Samir said是正确的。每次调用该函数时,都会调用返回语句return new Promise(...)(这是使用promise的预期方式)。

JavaScript也具有闭包的概念,闭包意味着传递给该函数的参数仅在该函数的执行中出现。所有原始数据(包括对象引用被“关闭了”,因此当循环改变item,它不会影响之前的函数调用。

唯一的问题还是要问的是你是否真的要并行他们都执行。你所拥有的循环将执行所有这些,而不必等待先前的解决方案。

由于您使用的是Angular,请查看Observables。他们的学习曲线有些陡峭(您在使用时会有不同的想法),但他们是非常有用的,一旦你了解他们。

引言,帮助我fi最终了解Observables是这样的:https://gist.github.com/staltz/868e7e9bc2a7b8c1f754