Java脚本承诺术语



我对承诺不熟悉,所以为这个新手问题道歉。在我的函数中,我有以下几行(函数的中间):

...
const retPromise = await buildImgs(file, imgArray);
retPromise.then(async function () {
console.log("completed build imgs");
...

我的假设是"在等待完成之前,promise不会执行。但是,唉,它的行为就像同步代码,而retPromise计算& then"在构建完成之前(由我的console.log流测量)。结果是一个未定义的retPromise。

请帮…我在这个概念中遗漏了什么?

OK:在反馈之后,让我进一步解释我的问题:我试图理解这个异步/同步流和控制概念:

const retVal = somefunc();
console.log(retVal);
const retVal = await somefunc();
console.log(retVal);

在第一种情况下,如果我正确理解同步/异步代码,那么当console.log找到它时,我应该有可能发现retVal是未定义的…

在第二种情况下,我认为它会停止流,直到somefunc()完成,然后流将继续。然而,我的阅读似乎表明,它仍然会尝试运行console.log消息作为一个并行线程。因此,这使我相信我需要将console.log放在。then之后的某个函数中。这让我想到了承诺。所以我做了一个承诺回报,我看到它发生了。

然而,.then,就像我原来的邮政编码一样,似乎在我的建筑物内的代码完成之前发布控制台消息"完成构建图像"(通过我知道要采取的功能的时间来衡量,以及建筑物内的控制台消息来帮助我进行排序)

所以对我来说,我似乎仍然缺少关于如何阻塞异步代码流的基本知识。(

当您使用await构造时,脚本等待直到promise解析并从该promise返回到您的retPromise值。所以在这种情况下,最好选择一个。去掉await,保留then,或者保留await,使用retPromise

假设buildImgs实际上返回一个承诺(示例)

const buildImgs = (file, imgArray) => {
return new Promise((resolve, reject) => {
try {
// ...
resolve()
} catch (err) {
reject(err)
}
})
}

当你在一个promise上调用await时,它已经在等待promise完成,如果你在调用上删除await,那么你可以使用.then

有两种方法来编写承诺处理程序,旧的方法是这样的
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)
})

最新更新