Что такое синтаксис «async/await» в коде зомби?

Когда я прочитал исходный код Zombie.js, я нашел async/await ключевое слово:

before(async function() {
  await browser.visit('/streaming');
  await browser.pressButton('1');
});

https://github.com/assaf/zombie/blob/41807a39c7aa1a13c4ef51575e0d581be96175bc/test/event_source_test.js#L60

Почему он может использовать такие ключевые слова? Каково поведение кода? Я пытался найти какую-нибудь подсказку в кодовой базе, но не повезло


person Freewind    schedule 25.04.2015    source источник
comment
См. github.com/tc39/ecmascript-asyncawait.   -  person elclanrs    schedule 25.04.2015
comment
stackoverflow.com/q/28708975/1048572   -  person Bergi    schedule 25.04.2015


Ответы (4)


Если мы проверим gulpfile, использованный для сборки этого проекта, мы увидим что источник передается через babel.

gulp.task('build', ['clean'], function() {
  return gulp
    .src('src/**/*.js')
    .pipe(sourcemaps.init())
    .pipe(babel({
      experimental: true,
      loose:        'all',
      optional:     [
        'bluebirdCoroutines',
        'runtime'
      ]
    }))
});

Babel — это транспилятор, который позволяет вам писать код ES6+ и транспилировать его обратно в ES5.

Babel превратит ваш код ES6+ в дружественный код ES5, так что вы сможете начать использовать его прямо сейчас, не дожидаясь поддержки браузера.

Если мы проверим документы на сайте Babel, мы увидим, что в разделе ES7 experimental section, есть реализация для asyncFunctions.

Эти ключевые слова являются частью спецификации ES7, но они не стабилизировались. Следовательно, они включены в качестве экспериментальных функций Вавилона.

Проще говоря, функция async позволит вам await выполнить вызов, который возвращает promise.

async function() {
  // flow will be suspended here until
  // the promise returned by someFunction is resolved
  await someFunction()
}

ES6 будет включать так называемые генераторы, которые делают то же самое, но не специфичны для промисов. Вы можете начать видеть ключевое слово yield или функции, объявленные подобным образом function* () {}. Это так называемые генераторные функции.

Есть особенно хорошая статья от PouchDB, который объясняет реальный пример использования этих функций.

person Dan Prince    schedule 25.04.2015

Эти ключевые слова недоступны в EcmaScript 5, но предлагаются для EcmaScript 7 (версия, которая появится после будущей версии 6). Прямо сейчас вы можете использовать Babel для транскомпиляции ES6 и некоторого кода ES7 в ES5, за некоторыми исключениями (в частности, проксирование, поскольку это невозможно внутри ЭС5). Специально для этого вы можете ссылаться на экспериментальные функции Babel, в частности на этап 1, es7.asyncFunctions.

person josh    schedule 25.04.2015

Это новая функция, запланированная для ES7, которая зависит от промисов и генераторов.

Почему он может использовать такие ключевые слова?

Потому что они транспилируют код с помощью Вавилон.

Каково поведение кода?

В основном это означает следующее в стиле прохождения продолжения:

before(function() {
  browser.visit('/streaming', function() {
    browser.pressButton('1');
  });
});
person elclanrs    schedule 25.04.2015

Это одна из лучших вещей, которые когда-либо приходили в JavaScript, помимо модулей и классов. Ознакомьтесь с этими двумя статьями и библиотекой, чтобы почувствовать мощь:

Кроме того, при поиске по запросу "javascript async await" будут обнаружены некоторые больше хороших статей и примеров.

person trusktr    schedule 06.01.2016