等待操作员的位置

时间:2018-10-13 17:21:03

标签: javascript async-await

我想知道await运算符在JavaScript中的灵活性。具体来说,我们可以在表达式中(在async函数内部)使用它的方式和位置。

例如

!await Promise.resolve(10);
await !Promise.resolve(10);

以上两个(或两者都哪个)有效,哪个更“常规”?表达式的预期返回值为!10

为概括起见,您可以用任何其他类型的表达式/运算代替!

以下(在编程实践方面)是否正确有效?

for (const i=0; i < await Promise.resolve(10); i++) {...}

我可以参考这方面的深入官方文档吗?

3 个答案:

答案 0 :(得分:2)

for (const i=0; i < Promise.resolve(10); i++)

Promise.resolve(10)的值是一个承诺,而不是数字。结果,i < Promise.resolve(x)的比较将始终为假,i > Promise.resolve(x)的比较也将为假,因为您正在与NaN进行比较。

// all comparisons with NaN are false
console.log(10 < Promise.resolve(1))
console.log(10 > Promise.resolve(1))
console.log(10 == Promise.resolve(1))
console.log(Promise.resolve(1) == Promise.resolve(1))

您根本无法在异步功能之外使用诺言。您可以执行此操作(这不是建议):

async function test(){
    for (let i = 0; i < await Promise.resolve(10); i++){
        console.log(i)
    }
}
test()

类似地,!Promise.resolve(10)将得到not some promise而不是not 10的结果。但是等待结果会按预期进行,因为那样您就可以比较一个数字。

答案 1 :(得分:1)

首先,Promise.resolve(10)返回一个诺言,该诺言立即解析为值10。

其次,您始终需要从await函数内部async来作出承诺。

因此,假设您实际上想进行!await Promise.resolve(10);,那么除了!10之外,我认为您的任何示例都没有多大意义。

在您的for循环示例for (const i=0; i < Promise.resolve(10); i++) {...}中,您正在做的是将诺言与数字进行比较,这没有任何意义。您需要先等待诺言。

答案 2 :(得分:0)

在for循环中,表达式 i 始终为false,因为 Promise.resolve(10)是一个对象,因此循环体将永远不会被执行。