繁体   English   中英

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

[英]Async function won't return when the promise is resolved

我有以下代码:

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> }返回。 为什么会这样呢?

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

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

其次,这是函数中事件的顺序。

  1. 您调用checkValue(...)并传递其参数。
  2. 第一行执行await getValue()
  3. 这将调用getValue()并收到一个promise。
  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 无论async函数的return值是什么,该值都会成为已从该函数returnasync的解析值。 口译员为您完成。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM