Размещение оператора ожидания - PullRequest
0 голосов
/ 13 октября 2018

Мне было интересно узнать о гибкости оператора await в JavaScript.В частности, как и где мы можем использовать его в выражении (внутри функции async).

например,

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

Какие из двух приведенных выше (или оба?) Действительны ичто является более "обычным"?Ожидаемое возвращаемое значение выражения: !10.

. Обобщая, вы можете заменить любые другие выражения / операции вместо !.

.действительный и подходящий (с точки зрения практики программирования)?

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

И есть ли для этого исчерпывающая официальная документация, на которую я могу сослаться?

Ответы [ 3 ]

0 голосов
/ 13 октября 2018
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.Но ожидание результата работает, как и ожидалось, потому что тогда вы сравниваете число.

0 голосов
/ 13 октября 2018

В цикле for выражение i всегда будет ложным, поскольку Promise.resolve (10) является объектом, поэтому тело цикла никогда не будетказнены.

0 голосов
/ 13 октября 2018

Во-первых, Promise.resolve(10) возвращает обещание, которое немедленно разрешается до значения 10.

Во-вторых, вам всегда нужно await обещание из async функции.

Так что я не думаю, что какой-либо из ваших примеров имеет большой смысл, кроме, может быть, !await Promise.resolve(10);, если предположить, что вы, по сути, хотите выполнить !10.

В вашем примере для цикла, for (const i=0; i < Promise.resolve(10); i++) {...}, то, что вы делаете, сравнивает обещание с числом, которое не имеет смысла.Сначала вам нужно дождаться обещания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...