Promise.all与数组和对象之间的逗号运算符如何工作?

wat*_*ery 6 javascript promise

我遇到过这段代码:

const results = await Promise.all(
                          [ Model1.find({}), Model2.find({}) ],
                          Model3.find({})
                      ),
        v1 = results[0],
        v2 = results[1],
        v3 = results[2]
Run Code Online (Sandbox Code Playgroud)

all()用数组和单个对象调用- 模型*是Mongoose模型.

这是一个容易修复的错误,但我想了解它是如何给出结果值,它们是:

  • v1包含对应的所有文档 Model1
  • v2包含对应的所有文档 Model2
  • v3是 undefined

正如在逗号运算符的这个答案中所解释的那样,我只期望Model3.find({})实际返回数据results,因为逗号运算符应该计算第一个操作数但返回其第二个操作数(to Promise.all()).但它的,而不是周围的其他方法:results[0]results[1]都包含数据,而results[2](因此v3)是undefined.

我错过了什么?

Cer*_*nce 1

这是一个参数列表而不是单个表达式,因此逗号运算符不适用 - 数组

[Model1.find({}), Model2.find({})]
Run Code Online (Sandbox Code Playgroud)

被评估为传递给 的第一个参数Promise.all,第二个参数是

Model3.find({})
Run Code Online (Sandbox Code Playgroud)

Promise.all只接受一个参数,一个可迭代的;的第二个参数Model3被忽略,结果被[Model1.find({}), Model2.find({})]映射到它们的解析值。由于传递的数组只有两个值,因此Promise.all解析为也只有两个值的数组(索引[2]undefined)。

如果您将调用括Promise.all另一组括号中:

const results = await Promise.all((
  [ Model1.find({}), Model2.find({}) ],
  Model3.find({})
))
Run Code Online (Sandbox Code Playgroud)

那么您调用逗号运算符,因为第二组括号内的所有内容都将被计算为单个表达式,而解释器尝试为要传递给Promise.all. (但Promise.all接受iterable,而不是 a Promise,因此逗号运算符的计算:

await Promise.all((
  Model3.find({})
))
Run Code Online (Sandbox Code Playgroud)

然后会导致错误:

TypeError: undefined is not a function
Run Code Online (Sandbox Code Playgroud)