为什么等待功能返回待定承诺


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'>

最新更新