gpt4 book ai didi

javascript - 在 Node.js 中处理查询的异步调用

转载 作者:行者123 更新时间:2023-12-03 06:54:19 25 4
gpt4 key购买 nike

我在处理查询的异步调用方面有点困难,如何才能以正确的顺序获得响应。

我有一个用户数组,它有一个 json 对象的有效负载,我想要做的是将用户及其详细信息插入到不同的表中,例如电子邮件、图片等。下面是我的伪代码片段

var jsonObj = {};
var jsonArray = [];
for (var i = 0; i < userArray.length; i++) {
var userJSON = userArray[i];
if (typeof userJSONJSON.list_of_emails != 'undefined') {
conn.query('insert into user_tble set ?', userJSON, function (err, ins) {
conn.query('insert into user_emails (user_id,email_address,) values ?', [globalEmailAddressArray], function (err, ins2) {
conn.query('insert into user_phones (user_id,phone_number) values ?', [globalPhoneNumberArray], function (err, ins3) {
conn.query('insert into user_pictures (user_id,pic_url) values ?', ['http://localhost:300/somepicture'], function (err, ins4) {
jsonObj["result"] = "executed1";
jsonArray.push(jsonObj);
res.status(200).json(arr: jsonArray)
})
})
})
});
} else if (typeof userJSONJSON.list_of_phones != 'undefined') {
conn.query('insert into user_phones (user_id,phone_number) values ?', [globalPhoneNumberArray], function (err, ins3) {
conn.query('insert into user_pictures (user_id,pic_url) values ?', ['http://localhost:300/somepicture'], function (err, ins4) {
jsonObj["result"] = "executed2";
jsonArray.push(jsonObj);
res.status(200).json(arr: jsonArray)
})
})
}
}

如果我给出类似的有效负载

{
"pay_load":[
{
"list_of_emails": [
{"email":"user1@user1.com"}
],
"last_name": "",
"first_name": "User1"

},
{
"list_of_email_addresses": [
{"email":"user2@user2.com"}
],
"last_name": "",
"first_name": "User2"

},
{
"list_of_email_addresses": [],
"last_name": "",
"first_name": "User3"

}
]
}

如果我执行它返回的 json 代码例如,它返回给我输出

{
arr:[
{
result : "executed2"
}
]
}

由于异步性质,我想要类似的东西,我认为它会跳过剩余的两个。

{
arr:[
{
result : "executed1"
},
{
result : "executed1"
},
{
result : "executed2"
}
]
}

简而言之,我如何处理异步调用来实现上述输出。

最佳答案

我个人建议您考虑使用 Promise。我很幸运 bluebird它简化了 Node 可能变成的回调 hell 。但是,如果您想坚持使用回调,请查看 async图书馆。

您看到的问题是 for 循环将继续执行下一项而不等待回调。它也将退出而不等待任何回调。您希望每次迭代都运行查询,然后仅在查询完成后才继续。

编辑 此外,您会看到它提前返回,因为您在第一次调用时发送了响应。您想要等到整个列表都已填充,然后发送响应(请参阅下面的 Promises 示例)

这是使用异步的示例:

var async = require("async")

var userArray = ["mickey mouse", "donald duck", "goofy"];
async.eachSeries(userArray, function (user, cb) {
doFakeQuery('insert into user_tble set ?', function (err, ins) {
doFakeQuery('insert into user_emails (user_id,email_address,) values ?', function (err, ins2) {
doFakeQuery('insert into user_phones (user_id,phone_number) values ?', function (err, ins3) {
doFakeQuery('insert into user_pictures (user_id,pic_url) values ?', function (err, ins4) {
console.log("Finished queries for " + user)
cb();
})
})
})
});
}, function (err) {
console.log("Finished async.map")
})

function doFakeQuery(query, callback) {
console.log("Running query '" + query + "'")
//Mock an asynchronous callback
setTimeout(function () {
callback();
}, 300)
}

为了进行比较,这里是用 Promises 重写的代码。

var Promise = require("bluebird")
//Convert conn.query into a function that returns a promise, instead of a callback
var pQuery = Promise.promisify(conn.query)

var jsonArray = []

Promise.mapSeries(userArray, function (user) {
if (user.list_of_emails != undefined) {
return addUser(user)
.then(addEmails)
.then(addPhones)
.then(addPictures)
.then(function () {
jsonArray.push({result: "executed1"})
})
}
else if (user.list_of_phones != undefined) {
return addPhones()
.then(addPictures)
.then(function () {
jsonArray.push({result: "executed2"})
})
}
})
.then(function () {
console.log("Done!")
res.status(200).json(jsonArray)
})

function addUser(userJSON) {
return pQuery('insert into user_tble set ?', userJSON)
}

function addEmails() {
return pQuery('insert into user_emails (user_id,email_address,) values ?', [globalEmailAddressArray])
}

function addPhones() {
return pQuery('insert into user_phones (user_id,phone_number) values ?', [globalPhoneNumberArray])
}

function addPictures() {
return pQuery('insert into user_pictures (user_id,pic_url) values ?', ['http://localhost:300/somepicture'])
}

关于javascript - 在 Node.js 中处理查询的异步调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37351417/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com