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> }
为什么不等待我的响应?
为什么不等待我的回复?
这很简单,,因为您正在返回承诺。节点JS是单线线程,以非阻止方式执行。
这意味着在 get 函数中,返回响应是在分辨率的响应变量之前执行的。
尝试以下操作:
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();
此示例也返回了一个承诺,但是在这种情况下,我们正在等待进行承诺解决方案。
希望这有所帮助。
异步函数是非阻滞功能,将立即返回承诺而不是等待结果。例如,这允许多个async函数同时运行,而不是依次运行。
要等待结果,您可以使用等待的关键字阻止,直到解决承诺为止。等待命令将返回承诺的结果。例如,要记录GET功能的结果,您可以将最后一行更改为:
console.log(await get('http://www.httpbin.org/ip'))
更新:
让我再试一次(对不起,如果我在这里击败一匹死马)。
由于您的response
变量是异步函数,因此它的返回类型是通过异步函数的定义的承诺。即使在等待ret
变量,这只是意味着它在写入ret
变量时会阻止。response
异步功能需要运行到完成,以便等待完成。如果您想等待返回值,然后添加后处理,这里等待着很有用,但是在此示例中,您的尝试块可能只是:
try {
return request(url, _opt)
}
由于request
已经回报了承诺,因此额外的等待造成了小数量的开销,因为它隐含地创造了额外的诺言。
由于response
是一个承诺,并且您正在返回response
,因此该功能get
也返回了承诺。然后,您正在尝试记录这个诺言(显然不起作用)。这就是为什么您必须await
或.then
get
功能才能获得结果。
来源:https://medium.com/@bluepnume/learn-about-promises-before-you-start-using-usish-async-await-eb148164a9c8'>