Javascript 如何在nodejs中等待异步函数结果

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

我正在编写代码来添加json数据中每一行对应的数据。 所有函数和代码编写都已完成。调用所有数据后,它应该返回到json。 但在执行所有代码之前,它返回json。 因此,即使所有代码运行良好,json始终返回空值。 请告知

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
  });