我想知道await
运算符在JavaScript中的灵活性。具体来说,我们可以在表达式中(在async
函数内部)使用它的方式和位置。
例如
!await Promise.resolve(10);
await !Promise.resolve(10);
以上两个(或两者都哪个)有效,哪个更“常规”?表达式的预期返回值为!10
。
为概括起见,您可以用任何其他类型的表达式/运算代替!
。
以下(在编程实践方面)是否正确有效?
for (const i=0; i < await Promise.resolve(10); i++) {...}
我可以参考这方面的深入官方文档吗?
答案 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