let request = require('request-promise')
function get(url) {
let _opt = {}
let response = (async () => {
try {
var ret = await request(url, _opt);
return ret;
} catch (e) {
console.log(e)
}
})();
return response
}
console.log(get('http://www.httpbin.org/ip'))
给出:
Promise { <pending> }
为什么不等待我的回复?
答案 0 :(得分:4)
为什么不等待我的回复?
这很简单,因为你正在回复一个承诺。节点js是单线程,以非阻塞方式执行。
这意味着获取函数中的返回响应将在响应变量的解析之前执行。
请尝试以下:
let request = require('request-promise')
function get(url) {
let _opt = {}
return request(url, _opt);
}
async function some () {
console.log(await get('http://www.httpbin.org/ip'));
}
some();
此示例也返回了一个承诺,但在这种情况下,我们等待承诺解析。
希望这有帮助。
答案 1 :(得分:3)
异步函数是非阻塞的,会立即返回一个promise,而不是等待结果。例如,这允许多个异步函数并发运行,而不是每个顺序运行。
要等待结果,您可以使用await关键字来阻止,直到解析了promise。 await命令将返回promise的结果。例如,要记录get函数的结果,可以将最后一行更改为:
console.log(await get('http://www.httpbin.org/ip'))
<强>更新强>
让我再试一次(对不起,如果我在这里击败一匹死马)。
由于您的response
变量是异步函数,因此它的返回类型是异步函数定义的承诺。即使等待ret
变量,这只意味着它会在写入ret
变量时阻塞。 response
异步函数需要运行完成才能完成等待。如果您想等待返回值然后添加后处理,那么等待此处将非常有用,但在此示例中,您的try块可能只是:
try {
return request(url, _opt)
}
由于request
已经返回一个promise,额外的await会导致一些微不足道的开销,因为它会隐式创建一个额外的promise。
由于response
是一个承诺,并且您要返回response
,因此函数get
也会返回一个承诺。然后你试图记录这个承诺(这显然不起作用)。这就是您必须await
或.then
get
函数才能获得结果的原因。
资料来源:https://medium.com/@bluepnume/learn-about-promises-before-you-start-using-async-await-eb148164a9c8&#34;陷阱1:未等待&#34;