【问题标题】:Does Promise.all() execute an array of functions or do they execute when you put them into the array?Promise.all() 是执行函数数组还是在将它们放入数组时执行?
【发布时间】:2018-04-07 02:02:12
【问题描述】:

由于awaitArray.mapArray.reduce 中不起作用,您是否可以执行以下操作,或者这是否会被视为滥用Promise.all?通常会等待neo4j.session()

// inside a function

const QUERY = 'MATCH (n) RETURN n'
const argsArray = [{ sample: 'sadf' }, { sample: 'sadf' }, { sample: 'sadf' }]

const runQueries = argsArray.map(obj => neo4j.session.run(QUERY, obj.sample))

await Promise.all(runQueries)
      .then(results => results.forEach(result => console.log(result)))

【问题讨论】:

  • Promise.all(runQueries).then(console.log) 更干净
  • @dandavis 我严重怀疑他是否真的打算 console.log 任何东西,这只是附加业务逻辑的替代品。
  • 这是一个正确的评估。

标签: javascript ecmascript-6 async-await ecmascript-2017


【解决方案1】:

Promise.all() 是否执行函数数组?

不,它是一系列承诺

或者当你将它们放入数组时它们会执行吗?

没错,当你构建 Promise 时,它​​们就会被执行。

这会被视为对 Promise.all 的滥用吗?

不,这完全没问题,这实际上是 Promise.all 的重点。

但是你可能会这样做(一个接一个而不是并行执行):

(async function(){

for(const obj of argsArray)
  console.log( await neo4j.session.run(QUERY, obj.sample));

})()

【讨论】:

  • 建立承诺”是什么意思?那是通天塔吗?
  • @dandavis 我的意思是new Promise() 。如果它具有误导性,请随时编辑
  • 嗯。他没有使用new Promise(),所以对于新手来说仍然不清楚(更隐蔽)。不知道如何澄清...
  • @dandavis 我认为这很好,如果有人不确定,他可能会找到我们的谈话;)
【解决方案2】:

async.await 应该是顺序承诺链的语法糖。考虑到数据库查询应该同时运行,在这种情况下使用await Promise.all(...) 是完全可以的。

Promise.all 接受一组承诺(更具体地说,是一个可迭代的),并且承诺在它们被创建的那一刻开始执行。可能是Promise.all 通话之前的那一刻:

const promises = [Promise.resolve(1), Promise.resolve(2)];
// promises have been created at this point
Promise.all(promises).then(...)

或者它可能不是。如果一个可迭代对象不是一个数组而是一个生成器,则在Promise.all 调用期间会延迟创建promise:

const promiseGen = (function* () {
  yield Promise.resolve(1);
  yield Promise.resolve(2);
})();
// promises have not been created yet at this point
Promise.all(promiseGen).then(...)
// promises have been created

【讨论】:

    猜你喜欢
    • 2018-11-29
    • 2017-08-24
    • 1970-01-01
    • 2011-04-26
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    相关资源
    最近更新 更多