异步/等待不是等待承诺完成

异步/等待不是等待承诺完成

问题描述:

我有这个帖子的路线:异步/等待不是等待承诺完成

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 

“测试”输出应出现在主体输出之后。

问题: 这是怎么回事?据我所知,我认为我做了所有的异步/等待正确看到,因为我没有收到承诺错误。有任何想法吗?

+4

了'请求()'方法在年底采用了回调,这样看来,它不返回承诺,因此,在它基本上没有效果之前,“等待”权利。 – Sirko

+3

Theres是那里'request'的promisified版本。使用它并杀死那个回调... –

+0

感谢您的回复! – Phillip

问题是,你基本上没有在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)); 
} 
+0

谢谢你的作品:) – Phillip