[英]await not working for insert command in nodejs
我有一個插件數組,我想將它們插入到 db 表中。
var addons = [sample,sample,.....]
return new Promise((resolve,reject) => {
addons.foEach(async addon => {
// first check if the items is in db
const response = await Kinex.where({}).from('table_name');
if(response.length == 0){
// insert new record
const insertResp = kinex('table_name').insert(addon)
addon.system_id = insertResp[0];
}else{
addon.system_id = response[0].id;
}
})
})
我期望的是在數據庫中有唯一的記錄,但上面的代碼在數據庫中產生了重復的記錄。 請幫忙找出代碼的問題。
問題是在循環內運行async
函數。 正如@Felix 所提到的, forEach
不知道異步函數,也不等待您的 where 查詢返回。 如果你想在循環內以異步方式做事,你可以用for..of
循環來做。 還要確保在使用async/await
時始終使用try/catch
塊。 以下是您的案例中的代碼:
const addons = [sample,sample,.....];
return new Promise(async (resolve, reject) => {
try {
for (let addon of addons) {
// first check if the items is in db
const response = await Kinex.where({}).from('table_name');
if (response.length) {
const insertResp = await kinex('table_name').insert(addon)
addon.system_id = insertResp[0];
} else addon.system_id = response[0].id;
resolve(); // resolve with whatever you wants to return
}
} catch (e) {
reject(e)
}
});
您可以在for..of
閱讀有關async/await
for..of
更多信息。
正如@Sándor 所指出的,這是使用Promise.all
的代碼:
var addons = [sample, sample, .....]
return Promise.all(addons.map(async addon => {
// Do your async stuff here
// first check if the items is in db
const response = await Kinex.where({}).from('table_name');
if (response.length == 0) {
// insert new record
const insertResp = kinex('table_name').insert(addon)
addon.system_id = insertResp[0];
} else {
addon.system_id = response[0].id;
}
}))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.