Promise.all并且只在all期间执行(==懒惰)

时间:2017-12-18 15:49:59

标签: node.js promise

我正在努力更好地了解如何运行Promise.all,它将仅在“all”期间执行相关方法

在此特定流程中,方法正在立即执行。 我错过了什么?

var p1 = p.connectToServer(platform1, username1, password1)
var p2 = p.connectToServer(platform2, username2, password2)
var p3 = p.connectToServer(platform3, username3, password3)

//some logic to decide what to show and what to filter out
//it might not make sense in this snippet, but in the full code-base 
//this seperation is important
var params = [p3,p2]

Promise.all(params)
.then((responses) => {
    console.log("--- value ---")
    console.log(responses.length)
}

P.S。在我的情况下,有一个地方为后期准备函数,并且其他一些逻辑并行发生,这有助于理解哪些方法不应该运行并且应该被过滤掉(在执行之前)

1 个答案:

答案 0 :(得分:3)

Antonio Narkevich评论中的链接是合理的,但从我的观点来看,这是一种过度设计的解决方案。

答案基本上是"没有"。不,你无法控制Promise解决的流程。一旦创建了Promise,你无法控制"何时以及如何"它正在得到解决。

Promise.all只是等待所有Promise解决后再返回它们的值。

如果您需要更动态地创建承诺,最简单的方法是制作某种工厂方法。

const giveMePromise = () => Promise.resolve(10);
// some code ...
giveMePromise().then()

如果你可以使用async / await,它可以很容易地使用(你也可以将所有的promises放在数组中然后等待Promise.all):

async () => {
  var p1 = () => p.connectToServer(platform1, username1, password1)
  var p2 = () => p.connectToServer(platform2, username2, password2)
  var p3 = () => p.connectToServer(platform3, username3, password3)

  const responses = [];
  var params = [p1,p2,p3]
  for (let i=0; i < params.length; i++){
    const response = await params[i]();
    responses.push(responses);
  }

  console.log("--- value ---")
  console.log(responses.length)
}

另一方面,要非常小心&#34;功能内部的功能&#34;使用async / await时,因为它不能正常工作。在这种情况下 - 使用params.forEach()将无效。