为什么等待函数返回未决的承诺

时间:2017-09-03 00:21:57

标签: node.js async-await

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

为什么不等待我的回复?

2 个答案:

答案 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;