解决承诺后,异步功能将不会返回

时间:2019-06-30 15:05:36

标签: javascript node.js asynchronous async-await

我有以下代码:

let checkValue = async (nodeUrl, nodeName, value) => {

    let json = await getValue(nodeUrl, value);

    let obj = JSON.parse(json.value.information);

    for (let i = 0; i < obj.nodes.length; i++) {
        if (obj.nodes[i] === nodeName) {
            return Promise.resolve(true);
        }    
    }
    return Promise.resolve(false);
}

我尝试使用Promise.resolve()处理返回的Promise值,但仍然得到Promise { <pending> }返回。为什么会这样?

1 个答案:

答案 0 :(得分:1)

让我们解释一下async函数中会发生什么。

首先,所有异步函数都返回一个Promise。总是。您将始终需要使用.then()await来从返回的承诺中获取价值。

第二,这是函数中的事件顺序。

  1. 您调用checkValue(...)并传递其参数。
  2. 第一行执行await getValue()
  3. 这会调用getValue()并收到承诺。
  4. 由于您正在执行await,因此它将中止函数的进一步执行,并且在那个时间点,函数将返回未解决的Promise。
  5. 那未解决的诺言就是您正在寻找的东西。
  6. 与此同时,调用getValue()之后的其余代码将继续执行。
  7. 有时,当JS解释器完成所执行的操作并转到下一个事件的事件队列时,它将发现导致getValue()兑现其诺言的事件。
  8. 这时,来自getValue()承诺的已解析值将分配给您的json变量,并且checkValue()函数的执行将被暂停并继续执行。
  9. 然后,根据您的for循环中的值,您的函数将通过返回已解析的Promise完成。请注意,没有理由进行return Promise.resolve(true)return Promise.resolve(false)。仅需要return truereturn value。来自return函数的async值将成为已从该函数返回的Promise的已解析值。口译员为您做到这一点。
  

我试图使用Promise.resolve()处理返回的Promise值,但是我仍然得到Promise { <pending> }返回。为什么会这样?

首先,您会得到一个承诺,因为所有async函数都会返回一个承诺。

第二,在您检查它时尚未解决,因为该函数在第一个await处被挂起,并且此时async函数实际上返回了promise,在那时,它尚未解决,因为该函数尚未完成执行(由于await)。请参阅上面的步骤4。