Почему после ожидания можно переназначить `const x` в консоли? - PullRequest
2 голосов
/ 09 февраля 2020

РЕДАКТИРОВАТЬ: Я обнаружил, что вам даже не нужна функция. Это также работает для меня:

const x = await 'hello'
x = 'something else'

Обратите внимание, что без await выдает ошибку.

Сначала определив асинхронную функцию c,

async function a() {
  return new Promise(resolve => {
    resolve('hello')
  })
}

Затем присваивание x 'hello',

const x = await a()

Затем переназначение x.

x = 'something else'

Если x - постоянная переменная почему его можно переназначить? Есть ли что-то очевидное, что я здесь упускаю?

Вот полный код (проверено в консоли браузера на Chrome 80.0.3987.87):

async function a() {
  return new Promise(resolve => {
    resolve('hello')
  })
}

const x = await a()

x = 'something else'

Ответы [ 4 ]

3 голосов
/ 09 февраля 2020

Я не могу воспроизвести то, что вы описываете. Это выдает ошибку для меня.

async function a() {
  return new Promise(resolve => {
    resolve('hello')
  })
}

(async () => {
  try {
    const x = await a();
    x = 'something else';
    console.log("worked", x);
  } catch (err) {
    console.log("didn't work", err.toString());
  }
})()

С вашим обновленным вопросом я вижу, что это происходит при вводе кода в консоли разработчика chrome. Более того, ваш код использует await вне функции asyn c. Ожидание верхнего уровня еще не является частью javascript стандарта, хотя оно проходит свой путь через процесс утверждения . Инструменты разработчика позволяют вам это делать, но я не удивлюсь, если полученное поведение будет нестандартным.

2 голосов
/ 09 февраля 2020

Обновление: Я могу воспроизвести ошибку в: Firefox 72.0.2 (64-разрядная версия), однако, если вы оберните ее в функцию async, она не будет t вести себя так ..

Чтобы узнать больше о: Предложение ECMAScript: Ожидание верхнего уровня

Вы можете ожидайте строки, потому что это разрешено: block-await-expr-literal-string. js, AwaitExpression StringLiteral (допустимый синтаксис для верхнего уровня, ожидающий в блоке.) Таким образом, const x = await ''; является допустимым синтаксисом

(async () => {
    async function a() {
        return new Promise(resolve => {
            resolve('hello')
        })
    }

    const x = await a()

    x = 'something else'

})();

Хм, возможно, вам не хватает консольного отладчика ..

async function a() {
  return new Promise(resolve => {
    resolve('hello')
  })
}

const x = await a()

x = 'something else'
x = 'not assignable... in console or whatever..';

Type Error

Execution is paused..

0 голосов
/ 09 февраля 2020

Прежде всего, пожалуйста, не используйте консоль браузера как идеальную среду редактора, когда вы изучаете эти вещи.

Во-вторых, я только что проверил то, что вы упомянули в консоли браузера.

Если Вы просто копируете и пропускаете весь свой код, как только он дает ошибку, как и ожидалось, говоря, что константы не могут быть переназначены. как ясно сказано в ответе @some пользователя.

Но если вы копируете и пропускаете его построчно, это не даст вам никаких ошибок.

Я не совсем уверен, что это причина, но вы не можете ожидать, что консоль браузера обеспечит вам 100% компиляцию / среду проверки.

Так что, если это не простая оценка выражений, лучше использовать хорошую среду разработки, чтобы не запутаться неожиданным поведением.

Если вам все еще нужно что-то, что работает в браузере, попробуйте это http://www.typescriptlang.org/play/

РЕДАКТИРОВАТЬ: Я нашел этот комментарий @Nicholas Tower ответ, и, похоже, правильный ответ на этот вопрос

"Предложение верхнего уровня - только для модулей, оно не повлияет на ожидание в консоли devtools. - Берги "

Удачного кодирования !!!

0 голосов
/ 09 февраля 2020

Вы не должны использовать ключевое слово await в функции syn c (ваше удовольствие c - это глобальная область видимости). Это не имеет смысла. Мы используем await для ожидания какой-либо асинхронной операции c для ex. Вызов API.

Если вы удалите await , обычно выдается ошибка.

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