【问题标题】:Accessing the value of a setTimeout promise without awaiting it在不等待的情况下访问 setTimeout 承诺的值
【发布时间】:2019-08-08 10:09:55
【问题描述】:

我正在编写一些代码来模拟我只想进行一次的数据库调用,并将结果存储在地图中(以防止重复往返)。

我的代码似乎工作正常,但我得到了一个意想不到的结果:当我删除一个等待值(在下面突出显示)时,代码似乎在等待承诺的解决(因为 console.log 仍然等待 5 秒),但记录的值仍然是 Promise。

在我看来,这似乎不一致,所以我认为我对 Promise 的理解可能有所欠缺。

const inputs = ['a', 'b'];

let promiseOrValue

async function processor(input){
    if (promiseOrValue){
        await promiseOrValue
    }
    else {
        promiseOrValue = asyncFunction()
        await promiseOrValue
    }
    console.log(`${input} ${**await** promiseOrValue}`)
}

async function asyncFunction(){
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log('resolving')
            resolve('foo')
        }, 1000)
    })
}

inputs.forEach(processor)

我希望console.log 将立即打印[object Promise],或者等待5 秒并打印foo。事实上,它等待 5 秒,然后打印 [object Promise]

【问题讨论】:

  • 无论如何,您正在执行await promiseOrValue的更高功能,所以这就是您在任何一种情况下都在等待的原因。
  • 一个 Promise 对象只是承诺你会在未来的某个时候得到一个值。如果您不打算等待该值,那么您当然会得到承诺而不是值。
  • .forEach() 不会在其回调中暂停 await。因此,您的 .forEach() 循环会立即运行到完成,这似乎不太可能是您想要的。这段代码看起来很混乱。如果您备份并更准确地描述您要完成的工作,您可能会在一个好的设计方面获得更好的帮助。您是否只是尝试为最近检索的值构建数据库缓存,以便可以从缓存中获取最近检索的值?

标签: javascript promise async-await


【解决方案1】:

问题是您已经等待promiseOrValue,但没有将其返回数据分配给任何变量。因此该过程将暂停,直到promiseOrValue 完成。

await promiseOrValue;

您需要删除 await 才能不暂停您的进程。

【讨论】:

  • 谢谢田。我认为我的假设是 await 改变了传递给它的值,但事实并非如此。
  • @RichardCoates - 不,await 暂停该函数的执行,直到您等待的承诺解决。 async 函数中的第一个 await 导致 async 函数暂停并立即返回一个承诺,该承诺最终将在函数返回其最终值时解决。
  • @jfriend00 - 我明白,让我感到困惑的是 promiseOrValue 被分配了一个承诺,然后我们一直在等待,但是当我们记录它时,它仍然是一个承诺,而不是一个值。跨度>
  • @RichardCoates - promiseOrValue 永远不会因为 await 而改变它自己的价值。约定了。就是这样。如果您想从中获得价值,请使用let value = await somePromise。我建议阅读一些关于使用await 的介绍性教程。您缺少关于它如何与 Promise 一起使用的基本核心概念。
猜你喜欢
  • 2020-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-31
  • 1970-01-01
  • 2019-04-29
  • 2019-12-10
  • 1970-01-01
相关资源
最近更新 更多