代码之家  ›  专栏  ›  技术社区  ›  watery

你怎么知道的答应我。好的在数组和对象之间使用逗号运算符?

  •  5
  • watery  · 技术社区  · 6 年前

    我遇到了一段代码:

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

    正在调用 all() 使用数组和单个对象-` 模型*是猫鼬模型 .

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

    • v1保存与 Model1
    • v2保存与 Model2
    • undefined

    如中所述 this answer on the comma operator ,我只希望 Model3.find({}) 承诺实际返回数据 results ,因为逗号运算符应该计算第一个操作数,但返回第二个操作数(到 Promise.all() ). 但事实恰恰相反: results[0] results[1] 两者都包含数据,而 results[2] v3 )是 未定义

    我错过了什么?

    2 回复  |  直到 6 年前
        1
  •  1
  •   CertainPerformance    6 年前

    那是个好主意 参数列表 而不是单个表达式,因此逗号运算符不适用于数组

    [Model1.find({}), Model2.find({})]
    

    作为传递给的第一个参数进行计算 Promise.all

    Model3.find({})
    

    但是 答应我。好的 只接受一个参数,iterable;的第二个参数 Model3 只是被忽略了,结果只是 [Model1.find({}), Model2.find({})] 映射到其解析值。由于传递的数组只有两个值,因此 解析为也只有两个值(索引)的数组 [2] undefined ).

    如果你把这封信 呼叫 另一个

    const results = await Promise.all((
      [ Model1.find({}), Model2.find({}) ],
      Model3.find({})
    ))
    

    那你呢 调用逗号运算符,因为第二组括号内的所有内容都将作为 单一表达式 答应我。好的 . (但是 接受 ,不是 Promise ,因此逗号运算符的求值:

    await Promise.all((
      Model3.find({})
    ))
    

    TypeError: undefined is not a function
    
        2
  •  3
  •   Suren Srapyan    6 年前

    Promise.all([ Model1.find({}), Model2.find({}) ], Model3.find({}))
    //          ^-     First parameter            -^  ^- second    -^
    

    你只给政府做了两个承诺 Promise.all 功能-

    1. [Model1.find({}), Model2.find({})]
    2. Model3 作为第二个参数- Model3.find({}) .

    型号3 已传递,但被函数忽略-函数只接受 -第一个必须是

    语法

    Promise.all(iterable);


    Promise.all 只要运行那些在第一个参数中定义的承诺,就只会得到结果 Model1.find({}) Model2.find({}) .

    你这么认为 results[2] 是由于 Model3.find({}) ,但不是。在本例中,它是一个包含2项的数组—通过 数组/iterable . 当您要访问数组的索引时,如果该索引大于 length - 1 undefined .

    看下面的例子。我已经向函数传递了5个参数,但是我的函数只接受前两个参数,所以 3, 4, 5

    function foo(a, b) {
       console.log(a, b);
    }
    
    foo(1, 2, 3, 4, 5);