繁体   English   中英

java 脚本承诺行话

[英]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.

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