【问题标题】:Async/Await not waiting for promise to finish异步/等待不等待承诺完成
【发布时间】:2018-03-05 10:29:48
【问题描述】:

我有这个发帖路线:

  app.post("/new", async (req, res) => {
    const Lob = require("lob")({ apiKey: keys.LOB_API });

    let toAddress = await lobFuncs.toAddress(req.body.addrLine1, Lob);

    console.log("test");
  });

toAddress() 函数如下所示:

toAddress: async (address, Lob) => {
    await this.parseGoogleCiv(address, obj => {
      console.log(obj);
    });
  },

parseGoogleCiv: async (address, callback) => {
    address = address
      .trim()
      .split(" ")
      .join("%20");

    let URL = "some long URL"

    await request(URL, function(err, res) {
      if (err) {
        console.log(err);
      } else {
        let body = JSON.parse(res.body);
        callback(body);
      }
    });
  }

但这是我的输出...

test
body

“测试”输出应该在正文输出之后。

问题: 这里发生了什么?据我所知,我认为我正确地完成了所有异步/等待,因为我没有收到承诺错误。有什么想法吗?

【问题讨论】:

  • 最后的 request() 方法需要一个回调,所以它似乎没有返回一个承诺,因此之前的 await 基本上没有效果。
  • 那里有一个承诺版本的request。使用它并杀死那个回调......
  • 感谢您的回复!

标签: javascript node.js promise async-await


【解决方案1】:

问题是您在 parseGoogleCiv 函数中基本上没有等待任何内容。可能会:

parseGoogleCiv: async (address) => {
  address = address
  .trim()
  .split(" ")
  .join("%20");

  let URL = "some long URL"

  try {
    return JSON.parse(
     (await new Promise((resolve,rej) =>  request(URL, function(err, res) { 
       if(err) return rej(err);
       resolve(res);
      }))).body
    );
  } catch(err){
    console.log(err);
  }
}

如果你使用promisified request version,这可能会更优雅:

parseGoogleCiv(address){
  address = address
  .trim()
  .split(" ")
  .join("%20");

 const url = "someurl";

 return request(url)
   .then(res => JSON.parse( res.body ))
   .catch( err => console.log(err));
}

【讨论】:

    猜你喜欢
    • 2018-02-03
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 2017-06-17
    • 2020-10-04
    • 2021-11-09
    • 2020-11-19
    • 1970-01-01
    相关资源
    最近更新 更多