javascript - nodejs(Web Api)中的异步和等待
问题描述
我试图在我的循环中使用promise,但循环不会等待,而是打印一个上面声明的空数组值。这是我的代码:
节点:
let total_json = [];
await Promise.all(results.map(async (element) => {
if (element.start_date <= d && element.end_date >= d) {
let query = "select * from tb_voucher_category where id = " + "'" + element.cateID + "'";
body.query = query;
COMMON(body, (err, results) => {
if (err) { fatal_error.data = err; return res.json(fatal_error); }
if (results) {
if (results.length > 0) {
cate = results[0].cateName;
} else {
cate = "";
}
let json = {
id: element.id,
catename: cate,
title: element.title,
description: element.description,
expired_date: element.expired_date,
expired_time: element.expired_time,
vStatus: element.vStatus
}
total_json.push(json);
}
});
}
}));
///i need the json printed here but it becomes null. how can i use async or promise here?
console.log(total_json)
我见过很多堆栈问题,我只是无法在我的代码中实现它。
解决方案
假设您使用的是 Express.js(从 推断res.json()
),我建议将数据库调用与响应隔离开来。
function resultsToJSON(results) {
if (results.length > 0) {
cate = results[0].cateName;
} else {
cate = "";
}
let json = {
id: element.id,
catename: cate,
title: element.title,
description: element.description
};
return json;
}
// returns a single promise that resolves to a list of json results,
// or rejects as an error.
function getData() {
// `promises` is a list of Promises that either resolve to the database result,
// or rejects due to a database error.
const promises = results
.filter(element => element.start_date <= d && element.end_date >= d)
.map(element => {
let query = "select * from tb_voucher_category where id = " + "'" + element.cateID + "'";
body.query = query;
return new Promise((resolve, reject) => {
COMMON(body, (err, results) => {
if (err) { reject(err); }
else { resolve(results); }
});
});
});
return Promise.all(promises);
}
然后,在您的 Express 请求处理程序中,您可以处理错误(并发送错误响应),或者total_jsons
从解析 Promise 中获取数组。
// mark function as `async` if you are going to use `await` in the body.
app.get("/yourAPI", async (req, res) => {
// given that `getData()` returns a promise that resolves to a list of results,
// `await getData()` waits for the promise to be resolved, and returns the list of results.
try {
const total_json = await getData();
} catch (error) {
// handle a failure in *any* of your database requests
fatal_error.data = error;
res.json(fatal_error);
}
});
推荐阅读
- perforce - 添加没有读取权限的文件以强制执行
- python-3.x - 使用 typing.List 的语法示例?
- javascript - 刷新令牌有什么用处?
- objective-c - 当没有互联网连接时,URLSession 返回 NSURLErrorTimedOut 而不是 NSURLErrorNotConnectedToInternet iOS 14
- html - PROGMEM R中的Arduino变量“=====(HTML
- javascript - 通过重叠的 HTML 元素进行画布交互
- delphi - 是否可以在 Delphi 10.3.3 社区版中创建 DataSnap 项目?
- firebase - Cloud Firestore 安全规则更改日志
- javascript - 在 React-Select 中禁用关注第一个选项
- powershell - 自动生成短文件名的简单方法