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)
- 暂无评论