我有以下代码:
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> }
返回。为什么会这样?
答案 0 :(得分:1)
让我们解释一下async
函数中会发生什么。
首先,所有异步函数都返回一个Promise。总是。您将始终需要使用.then()
或await
来从返回的承诺中获取价值。
第二,这是函数中的事件顺序。
checkValue(...)
并传递其参数。await getValue()
。 getValue()
并收到承诺。await
,因此它将中止函数的进一步执行,并且在那个时间点,函数将返回未解决的Promise。getValue()
之后的其余代码将继续执行。getValue()
兑现其诺言的事件。getValue()
承诺的已解析值将分配给您的json
变量,并且checkValue()
函数的执行将被暂停并继续执行。 for
循环中的值,您的函数将通过返回已解析的Promise完成。请注意,没有理由进行return Promise.resolve(true)
或return Promise.resolve(false)
。仅需要return true
或return value
。来自return
函数的async
值将成为已从该函数返回的Promise的已解析值。口译员为您做到这一点。我试图使用Promise.resolve()处理返回的Promise值,但是我仍然得到
Promise { <pending> }
返回。为什么会这样?
首先,您会得到一个承诺,因为所有async
函数都会返回一个承诺。
第二,在您检查它时尚未解决,因为该函数在第一个await
处被挂起,并且此时async
函数实际上返回了promise,在那时,它尚未解决,因为该函数尚未完成执行(由于await
)。请参阅上面的步骤4。