node.js - 返回异步/等待同步节点
问题描述
在这个 err.length 代码中总是返回 []。我哪里错了?
err.length 不等待地图结果
router.post('/add', authSigs, async (req, res) => {
const nds = req.body.nds
const split = nds.split('\n')
const err = []
await split.map(async item => {
let sub = item.substr(0, 7)
const checkModel = await modelSerial.findOne({
'modelNds': sub
})
if (!checkModel) err.push(item)
})
if (err.length > 0) return res.status(400).send({error: 'Invalid'})
return res.status(200).send()
})
解决方案
你没有await
在 a 上Promise
,你正在这样做await [Promise, Promise]
,你await
实际上并没有等待所有的承诺解决,你需要使用Promise.all
,它需要一系列承诺。
Promise.all(iterable) 方法返回一个 Promise,当可迭代参数中的所有承诺都已解决或可迭代参数不包含任何承诺时,该 Promise 将解决。它以拒绝的第一个承诺的原因拒绝。
const promises = split.map(async item => {
let sub = item.substr(0, 7)
const checkModel = await modelSerial.findOne({
'modelNds': sub
})
if (!checkModel) err.push(item)
});
await Promise.all(promises);
// Now all promises have been resolved
// err will contain items if there were any errors
推荐阅读
- php - 我什么时候必须使用'set names utf8'
- c# - 启动边缘浏览器
- python - 将 qbxml 文件导入 Quickbook - 桌面
- google-chrome - Chrome 未在“网络”选项卡中显示 OPTIONS 请求
- powershell - 为什么 WorkItemLinkCollection.Add 方法返回数字?
- javascript - 如何从 PDF 文件中的表格中提取数据?
- python - 如何将 ljust() 转换应用于字符串列表的每个元素?
- google-apps-script - 如何从命令行传递谷歌登录凭据以扣住登录?
- java - 可比较的 CompareTo 日期不起作用
- css - 为多个设备创建媒体查询的最简单方法