【问题标题】:What are the possibilities when you need to wait for a loop to finish executing before continuing在继续之前需要等待循环完成执行时有哪些可能性
【发布时间】:2018-08-08 18:27:07
【问题描述】:

我有一个简单的 for 循环,如下所示:

var array = [];

for (var key in results) {
    con.query('SELECT * FROM table WHERE id = ?', [results[key]], function (err, res, fie) {
        array.push(res);
    });
}

res.json({result: array});

循环中的代码需要时间来执行,因此在循环有时间完成之前发送结果,因此我的数组的值不正确。

我查了一下,但找不到对这个案例的正确回应。我想知道我的代码在继续之前等待循环完全执行的可能性是什么?

谢谢,非常感谢任何帮助

【问题讨论】:

  • 你应该使用承诺。
  • 我看不到在循环完成之前结果会被“发送”。除非您遗漏了一些重要信息。
  • 循环使用异步代码吗?
  • 您必须向我们展示您的实际代码,我们才能在这里为您提供帮助。到目前为止,您显示的代码是同步的,因此所有代码都在 for 循环完成之前执行。如果您在循环中确实有异步代码,那么您需要将其展示给我们,我们可以建议处理它的最佳方法。
  • 我已经更新了我的代码。我正在 for 循环中进行 db 调用,这解释了为什么代码是异步的。

标签: javascript node.js loops asynchronous promise


【解决方案1】:

如果你从来没有让 jfriend 知道你正在使用什么数据库,这里应该可以工作

// a "promisified" con.query ... though, not sure what the `fie` argument is
// as it's not used, it wont matter

const queryP = (sql, ...args) => 
    new Promise((resolve, reject) => 
        con.query(sql, ...args, (err, res, fie) => 
            err ? reject(err) : resolve(res)
        )
    );

现在,您可以编写代码了

results // if results is an Object, use: Object.values(results) instead
.map(result => queryP('SELECT * FROM table WHERE id = ?', result))
.then(result => res.json({result}));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多