最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

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

IT培训 admin 7浏览 0评论

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

我试图更好地了解如何运行Promise.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)
}
回答如下:

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

另一方面,在使用async / await时要非常小心“函数内部函数”,因为它没有像您预期的那样工作。在这种情况下 - 使用params.forEach()将无法正常工作。

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

我试图更好地了解如何运行Promise.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)
}
回答如下:

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

另一方面,在使用async / await时要非常小心“函数内部函数”,因为它没有像您预期的那样工作。在这种情况下 - 使用params.forEach()将无法正常工作。

发布评论

评论列表 (0)

  1. 暂无评论