异步/等待不是等待承诺完成
问题描述:
我有这个帖子的路线:异步/等待不是等待承诺完成
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);
}
}
这可能是更优雅,如果你使用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
了'请求()'方法在年底采用了回调,这样看来,它不返回承诺,因此,在它基本上没有效果之前,“等待”权利。 – Sirko
Theres是那里'request'的promisified版本。使用它并杀死那个回调... –
感谢您的回复! – Phillip