【问题标题】:Promises and async functions "borrowing" variables from concurrently running promisesPromise 和异步函数从并发运行的 Promise 中“借用”变量
【发布时间】:2019-01-17 13:18:01
【问题描述】:

我在辅助函数 answerUserTag 中有这个 Waterline 异步调用:

theQuestion = await UserTag.findOne({id: answerObject.tag});

这就是我如何称呼上面的助手:

const promises = userTagAnswers.map(userTagAnswer =>
  sails.helpers.answerUserTag.with(
    {
      userTagAnswer: userTagAnswer,
      answeringUserId: inputs.userId,
      userType: inputs.userType
    }));

await Promise.all(promises);

如果只有一个 userTagAnswers(即一个 promise),它可以正常工作。但是如果有两个 userTagAnswers 并且我在帮助程序中的 theQuestion 查询之后设置了一个断点,我会看到以下不合理的值:

answerObject.tag 等于5c338ae267a1983e84340388

theQuestion.id 等于5c27227ac1e60913703f3002

当调用多个 Promise 时,变量之间似乎存在不合逻辑的重叠。

【问题讨论】:

标签: javascript node.js asynchronous sails.js waterline


【解决方案1】:

尝试通过Promise.each() 调试它也许?由于迭代是顺序的,你会知道哪个 Promise 困扰着你。

其次,如果您指定辅助函数,那就太好了。

第三,为什么是with?如果你检查MDN - with,它清楚地表明我引用

不推荐使用with 语句,因为它可能是混淆错误和兼容性问题的根源。它有歧义相反。 with 语句使人类读者或 JavaScript 编译器难以决定是否会在作用域链中找到不合格的名称,如果是,则在哪个对象中。

【讨论】:

  • 使用 Promise.each() '解决了'问题,因为没有错误并且函数按预期运行,但我想弄清楚如何同时运行它们。
  • OP 没有使用with 语句,他使用了一个名为.with() 的方法。
  • 这是来自 MDN 的引述。但是,是的,告诉我它们是否不同。
【解决方案2】:

不一致的结果是因为 promise 正在解析异步

这可能会有所帮助:toniov.github.io/p-iteration

【讨论】:

    猜你喜欢
    • 2016-07-12
    • 2021-02-15
    • 2021-06-28
    • 2020-07-28
    • 1970-01-01
    • 2019-10-11
    • 2019-04-01
    • 2020-08-13
    • 2019-05-27
    相关资源
    最近更新 更多