【问题标题】:Promise scope different at execution time执行时的承诺范围不同
【发布时间】:2019-09-12 04:39:15
【问题描述】:

我正在尝试等待 (Promise.all) 使用 Sequelize.js 运行数据库查询的 Promises 数组,这解决了 > 来自then

我兑现我的承诺如下:

for (furnix in shorthandFurni) {

    furniData = shorthandFurni[furnix]
    furniSplit = furniData.split(":")    

    CompletedPromises.push(new Promise(resolve, reject) => {
        db.query("...").then(result => {
            . . .

            // depending on the for-loop
            resolve({
              otherdbdata: . . .,
              furniData: furniData,
              furniSplit: furniSplit
            })
        })
    })
}

然后返回(在 for 循环之后)。

return Promise.all(CompletionPromises)

这一切都很好,但问题源于变量 furniDatafurniSplit 是我承诺的解决方案的一部分......现在,当这段代码在我的服务器上执行时,它返回变量 @ 987654327@ 对于所有的承诺解决方案都相同。

基本上,我想知道如何将 furniSplit 作为变量带入 resolve 函数的范围,以便在 for 循环的每次迭代中提供唯一数据,而不是最后一个。

感谢您的帮助。

【问题讨论】:

  • 不要使用全局变量...使用let furniData =let furniSplit =,一切都会好起来的

标签: javascript node.js asynchronous promise sequelize.js


【解决方案1】:

乍一看,这似乎是一个范围界定问题。 试试

const furniSplit = furniData.split(":");

【讨论】:

  • 我现在在我的问题中添加了更多内容,我尝试了您的解决方案,结果与以前相同。
  • @JackHales 你把const 放在furniDatafurniSplit 上了吗?
  • 哦!现在工作!公平地说,我不确定为什么将其设为常量会使其工作,在我看来,这是一个在设置变量后动态访问的范围。你能给我解释一下吗?谢谢。
  • 它被称为hoisting 并导致变量被添加到函数外部的范围并被覆盖
【解决方案2】:

你可以使用该函数获取新的相同值Data,但它们不相等,因为引用不同。

   for (furnix in shorthandFurni) {

    const furniData = () => shorthandFurni[furnix]
    const furniSplit = () => furniData.split(":")    

    CompletedPromises.push(new Promise(resolve, reject) => {
        db.query("...").then(result => {
            . . .

            // depending on the for-loop
            resolve({
              otherdbdata: . . .,
              furniData: furniData(),
              furniSplit: furniSplit()
            })
        })
    })
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 2014-06-24
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多