为什么我的Promise数组在调用Promise.all()之前运行?

ale*_*xcs 10 javascript promise got

我试图创建一个Promises数组,然后使用Promise.all()解决它们.我正在使用got,它返回了一个承诺.

我的代码有效,但我不完全理解.这里是:

const got = require('got');

const url = 'myUrl';
const params = ['param1', 'param2', 'param3'];

let promiseArray = [];
for (param of params) {
    promiseArray.push(got(url + param));
}

// Inspect the promises
for (promise of promiseArray) {
    console.log(JSON.stringify(promise));
    // Output: promise: {"_pending":true,"_canceled":false,"_promise":{}}
}

Promise.all(promiseArray).then((results) => {
     // Operate on results - works just fine
}).catch((e) => {
    // Error handling logic
});
Run Code Online (Sandbox Code Playgroud)

让我失望的是,当我将Promises添加到数组中时Promise被标记为"pending",这意味着它们已经启动了.

我认为他们应该处于不活跃状态promiseArray,并且Promise.all(promiseArray)会启动它们并解决它们.

这是否意味着我两次开始他们?

Ara*_*edi 16

你不是两次开始他们.Prom一旦创建就开始运行 - 或者只要JS引擎找到足够的资源来启动它们.你无法控制他们何时真正开始.

一切Promise.all()都是等待所有人解决(解决或拒绝).Promise.all()不会干扰或影响承诺本身的执行顺序/时间.


jfr*_*d00 8

承诺根本不运行.它们只是一个通知系统,用于在异步操作完成时进行通信.

所以,只要你运行这个:

promiseArray.push(got(url + param));
Run Code Online (Sandbox Code Playgroud)

你的内部异步操作got()已经开始,当它完成时,它将通过promise传回.

所有的一切Promise.all()都是监控所有的承诺,并在第一个承诺拒绝或所有承诺成功完成时告诉您.它不以任何方式"控制"异步操作.相反,您启动异步操作,然后通过承诺进行通信.您可以控制何时启动异步操作,然后异步操作从此开始运行.


如果你将代码分解成碎片,这就是每件作品中发生的事情:

let promiseArray = [];
for (param of params) {
    promiseArray.push(got(url + param));
}
Run Code Online (Sandbox Code Playgroud)

这会调用got()很多次启动该函数中的异步操作. got()可能会返回一个承诺对象,然后将其放入您的promiseArray.因此,此时,异步操作已经全部启动并自行运行.

// Inspect the promises
for (promise of promiseArray) {
    console.log(JSON.stringify(promise));
    // Output: promise: {"_pending":true,"_canceled":false,"_promise":{}}
}
Run Code Online (Sandbox Code Playgroud)

这个循环只是查看所有的promises,看看是否有任何一个可能已经被解析,尽管人们不会指望它们是因为它们的底层异步操作刚刚在前一个循环中启动.

Promise.all(promiseArray).then((results) => {
     // Operate on results - works just fine
}).catch((e) => {
    // Error handling logic
});
Run Code Online (Sandbox Code Playgroud)

然后,Promise.all()你只需要监控承诺数组,这样就可以告诉你什么时候有被拒绝的承诺,或者当所有承诺成功完成时.