javascript - 使用异步调用在 for 循环中构建数组

标签 javascript node.js api

我是 JavaScript 新手,我正在尝试执行以下操作。我想迭代一个列表,并进行依赖于列表中的项目的数据库调用。显然,由于调用是异步的,因此当 for 循环结束时,没有返回任何调用,因此列表为空。

在 C# 中,我可以等待数据库调用,这样就可以正常工作。我尝试在 javascript 中找到类似的方法,但运气不佳

exports.methodName = (req, res) => {

    var itemsToReturn = []

    for (let item of list) {
        db.all(sql), (err, rows) => {
            itemsToReturn.push(rows)
        }
    }

    res.json(itemsToReturn )
}

我使用 SQLite 作为数据库

最佳答案

在 Javascript 中执行此操作的现代方法是为 db.all() 使用或创建一个 Promise 接口(interface)(而不是您显示的回调接口(interface)),然后使用 Promise。 all() 上的一个 promise 数组,用于了解所有异步操作何时完成。您没有说明您的数据库是什么,因此我们无法就您的数据库是否已经具有 Promise 接口(interface)(很多现在都有)提供任何帮助。

以下是假设 list 是一个数组的手动操作方法:

exports.methodName = (req, res) => {

    let itemsToReturn = [];
    let cntr = 0;
    for (let [index, item] of list.entries()) {
        db.all(sql), (err, rows) => {
            if (err) {
               // insert error handling here
            } else {
                itemsToReturn[index] = rows;
                ++cntr;
                if (cntr === list.length) {
                    res.json(itemsToReturn);
                }
            }
        }
    }
}

假设您的数据库有一个名为 db.allPromise() 的 Promise 接口(interface),您可以执行以下操作:

exports.methodName = (req, res) => {

    Promise.all(list.map(item => {
        return db.all(someSql);
    })).then(results => {
        res.json(results);
    }).catch(err => {
        res.sendStatus(500);
    });
}

关于javascript - 使用异步调用在 for 循环中构建数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41919257/

相关文章:

javascript - 单击时将 2 个 Bootstrap 列替换为 2 个隐藏列。 rails 4, Bootstrap

javascript - 如何将当前小时数与小时字符串 JavaScript 进行比较

javascript - D3 JS 传递给匿名函数的 F 是什么意思?

node.js - 在express.js中完成处理请求

api - AWS API网关: route error

jquery - 用背景颜色填充空白区域?

javascript - WebSocket JS 的自定义 header

javascript - 使用终端创建express项目时,为什么每个导入的库都带有 "var"?

javascript - 如何将 Protractor 中的 promise 转换为 float

c++ - 在 Clutter API 中使用 child Actor