簡體   English   中英

異步/等待不等待諾言完成

[英]Async/Await not waiting for promise to finish

我有這樣的帖子路線:

  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

“測試”輸出應在正文輸出之后。

問題:這是怎么回事? 據我所知,我認為我沒有正確地執行所有異步/喚醒操作,因為我沒有收到承諾錯誤。 有任何想法嗎?

問題在於您基本上不等待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);
  }
}

如果使用承諾的請求版本,這可能會更優雅:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM