Javascript 如何在nodejs中等待异步函数结果
我正在编写代码来添加json数据中每一行对应的数据。 所有函数和代码编写都已完成。调用所有数据后,它应该返回到json。 但在执行所有代码之前,它返回json。 因此,即使所有代码运行良好,json始终返回空值。 请告知Javascript 如何在nodejs中等待异步函数结果,javascript,node.js,promise,es6-promise,Javascript,Node.js,Promise,Es6 Promise,我正在编写代码来添加json数据中每一行对应的数据。 所有函数和代码编写都已完成。调用所有数据后,它应该返回到json。 但在执行所有代码之前,它返回json。 因此,即使所有代码运行良好,json始终返回空值。 请告知 var request = require('request'); var axios = require('axios'); router.get('/geometric/getAddress', async (req, res) => { let confm
var request = require('request');
var axios = require('axios');
router.get('/geometric/getAddress', async (req, res) => {
let confmKey = "secret";
let resultType = "json";
let countPerPage = "10"
let page = appjs.vCheck(req.query.page, "");
let kw = appjs.vCheck(req.query.keyword, "");
var stmt = "http://10.10.100.12:8080/addr.do?";
stmt = stmt + "currentPage=" + page;
stmt = stmt + "&countPerPage=" + countPerPage;
stmt = stmt + "&resultType=" + resultType;
stmt = stmt + "&confmKey=" + confmKey;
stmt = stmt + "&keyword=" + qs.escape(kw)
request(stmt, async (err, result) => {
if (err) throw err;
const con = JSON.parse(result.body);
const juso = con.results.juso;
var dd = ""
let res_data = juso.map(async (addr) => {
let admCd = appjs.vCheck(addr.admCd, "");
let rnMgtSn = appjs.vCheck(addr.rnMgtSn, "");
let udrtYn = appjs.vCheck(addr.udrtYn, "");
let buldMnnm = appjs.vCheck(addr.buldMnnm, "");
let buldSlno = appjs.vCheck(addr.buldSlno, "");
axios.post("http://localhost:3001/web/api/geometric/coordinates",
{
admCd : admCd,
rnMgtSn : rnMgtSn,
udrtYn : udrtYn,
buldMnnm : buldMnnm,
buldSlno : buldSlno
}).then((d) => {
return {
"roadAddr" : d.roadAddr,
"jibunAddr" : roadAddr,
"zipNo" : d.roadAddr,
"longitude" : roadAddr,
"latitude" : d.roadAddr
}
})
})
let aa = await Promise.all(res_data)
res.json(aa)
})
});
这是因为您没有从
map
回调返回任何承诺。你应该这样做:
let res_data = juso.map(async (addr) => {
let admCd = appjs.vCheck(addr.admCd, "");
let rnMgtSn = appjs.vCheck(addr.rnMgtSn, "");
let udrtYn = appjs.vCheck(addr.udrtYn, "");
let buldMnnm = appjs.vCheck(addr.buldMnnm, "");
let buldSlno = appjs.vCheck(addr.buldSlno, "");
return axios.post("http://localhost:3001/web/api/geometric/coordinates",
{
admCd : admCd,
rnMgtSn : rnMgtSn,
udrtYn : udrtYn,
buldMnnm : buldMnnm,
buldSlno : buldSlno
})
})
let aa = (await Promise.all(res_data)).map(({data: d}) => ({
"roadAddr" : d.roadAddr,
"jibunAddr" : roadAddr,
"zipNo" : d.roadAddr,
"longitude" : roadAddr,
"latitude" : d.roadAddr
}));
res.json(aa)
由于您没有从
map
函数返回任何promise
,因此等待promise.all(res_data)
是微不足道的代码
更新:
- Axios库返回完整的承诺,因此可以简单地从映射回调返回
- 然后,可以等待这些返回的承诺,并将其映射到期望的结果
等待
返回的承诺(最好使用try/catch
处理任何失败的承诺或Promise.all(res_data).Then().catch(e)
处理错误):
您没有从
map
回调返回承诺。为什么要将axios
与request
混合用于http请求?一个回报承诺,另一个没有@Bergi我知道axios会返回承诺,而将承诺包装在承诺中是不好的,而且返回承诺会更简单。虽然代码的编写方式不同,但在这种情况下可能不是这样。这里的catch(e)
处理程序在axios上使用reject
确实会冒出错误作为拒绝Promise.all
。我错过了什么?是的,只是兑现承诺会简单得多,效果也一样。不知道你所说的拒绝是什么意思,你认为反模式代码的工作方式有什么不同?是的,你没有忘记捕捉内部错误并拒绝外部承诺,所以这很好,但它仍然是完全过于复杂的代码,应该简化。允诺构造函数反模式仍然适用于非常容易出错的代码,即使正确地执行。我建议您自己去排除允诺反模式的答案——剩下的答案,尤其是解释,仍然是好的,并且你把所有你认为是好的答案都推到了一起。
let res_data = juso.map(async addr => {
let admCd = appjs.vCheck(addr.admCd, "");
let rnMgtSn = appjs.vCheck(addr.rnMgtSn, "");
let udrtYn = appjs.vCheck(addr.udrtYn, "");
let buldMnnm = appjs.vCheck(addr.buldMnnm, "");
let buldSlno = appjs.vCheck(addr.buldSlno, "");
return axios.post("http://localhost:3001/web/api/geometric/coordinates", {
admCd: admCd,
rnMgtSn: rnMgtSn,
udrtYn: udrtYn,
buldMnnm: buldMnnm,
buldSlno: buldSlno
});
});
await Promise.all(res_data)
.then(resolvedPromises => {
const aa = resolvedPromises.map(d => ({
roadAddr: d.roadAddr,
jibunAddr: d.roadAddr,
zipNo: d.roadAddr,
longitude: d.roadAddr,
latitude: d.roadAddr
}));
return res.json(aa);
})
.catch(e => {
//handle error because one of those axios promises failed: e.message
});