异步/等待不等待Promise完成

3

我有这个post路由:

  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

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

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


4
最后的request()方法需要一个回调函数,因此它似乎不返回一个Promise,因此在它之前的await基本上没有起作用。 - Sirko
3
有一个经过 Promise 化的 request 版本可供使用。使用它,消除回调函数... - Jonas Wilms
感谢您的回复! - Phil
1个回答

4
问题在于你的 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);
  }
}

如果您使用Promise化的请求版本,可能会更加优雅:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接