[英]java script promises lingo
我是新的承诺,所以为新手问题道歉。 在我的 function 中,我有以下几行(函数的中间):
...
const retPromise = await buildImgs(file, imgArray);
retPromise.then(async function () {
console.log("completed build imgs");
...
我的假设是 promise 中的“then”在等待完成之前不会执行。 但是,唉,它就像同步代码一样,并且 retPromise 在 buildImgs 完成之前评估“then”(由我的 console.log 流测量)。 结果是一个未定义的 retPromise。
请帮助...我在这个概念中遗漏了什么?
好的:反馈后,让我进一步解释我的问题:我正在尝试理解这个异步/同步流和控制概念:
const retVal = somefunc();
console.log(retVal);
const retVal = await somefunc();
console.log(retVal);
在第一种情况下,如果我正确理解了同步/异步代码,那么当 console.log 找到它时,我应该有可能未定义 retVal ......
在第二种情况下,我认为它会停止流动,直到 somefunc() 完成,然后流动将继续。 但是,我的阅读似乎表明它仍会尝试将 console.log 消息作为并行线程运行。 所以这让我相信我需要将 console.log 放在 the.then 的 somefunc 之后。 这让我做出了承诺。 所以我做了一个 promise 返回,我看到这正在发生。
但是,the.then,就像我原来的帖子代码一样,似乎在我的 buildImgs 中的代码完成之前发布了控制台消息“完成构建 imgs”(通过我知道要使用的 function 以及 buildImgs 中的控制台消息来衡量的时间来衡量)帮我测序)
所以在我看来,我仍然缺少有关如何阻止异步代码流的基础知识。 :(
当您使用await
构造时,脚本将等待 promise 解析并从此 promise 返回您的retPromise
值。 所以在这种情况下最好选择一个。 删除await
并保留then
,或保留await
并使用retPromise
值。
假设buildImgs
实际上返回 promise (示例)
const buildImgs = (file, imgArray) => {
return new Promise((resolve, reject) => {
try {
// ...
resolve()
} catch (err) {
reject(err)
}
})
}
当您在 promise 上调用await
时,它已经在等待 promise 完成,如果您在调用中删除await
那么您可以使用.then
有两种方法可以编写 promise 处理程序,旧的方法看起来像这样
buildImgs(file, imgArray)
.then(() => {
console.log('im done')
})
.catch(err => {
console.error(err)
})
和较新的语法
// you must declare "async" in order to use "await"
const asyncFunction = async () => {
try {
await buildImgs(file, imgArray)
console.log('im done')
} catch(err) {
console.error(err)
}
}
asyncFunction()
如果您需要 promise 的返回值,则将其分配给变量
const ineedResponse = await buildImgs(file, imgArray)
console.log(ineedResponse)
// or
buildImgs(file, imgArray)
.then(ineedResponse => {
console.log(ineedResponse)
})
.catch(err => {
console.error(err)
})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.