Async / await в веб-браузере или в node.js? - PullRequest
22 голосов
/ 09 октября 2011

Есть ли попытка перенести функцию async / await из C # 5.0 на любой язык, который можно скомпилировать в JavaScript (например, CoffeScript)? (Так что его можно использовать либо в веб-браузере, либо в node.js.)

Ответы [ 11 ]

16 голосов
/ 03 июня 2012

Async находится в списке функций для гармонии JavaScript.До сих пор предпринимались многочисленные попытки предоставить такую ​​функциональность в браузере или в узле, но ни одна из них не кажется совместимой с предложением гармонии:

  • Асинхронизация может быть смоделирована с помощью генераторов JS1.7 (см. task.js ).Пока не поддерживается в V8 ( без экспериментального режима ), но работает в FF.Возможно traceur или Masacra компилятор может быть использован для переноса генераторов в другие среды.
  • Существует библиотека node-fiber , предоставляющая другой механизм для асинхронногопрограммирование в узле (хотя и снижает производительность).Другая попытка, основанная на v8cgi, описана здесь .
  • Rhino имеет продолжений из коробки, обеспечивающих хорошую альтернативу.Вот почему Ringo.js стоит посмотреть.
  • Доступно несколько решений, основанных на переводе js2js, например: jscx , NarrativeJS jwacs , Стратифицированные JS .Некоторые поддерживают интеграцию с узлом.
  • Существует много библиотек обещания / будущего, пытающихся решить проблему обратных вызовов без расширения синтаксиса, однако все они страдают от проблем с компоновкой, то есть не могут использовать языковые конструкции, такие как циклы между обратными вызовами.1039 *
14 голосов
/ 11 августа 2014

async / await выглядит как в ECMAScript 7 .Это предложение было принято на этапе 1 процесса спецификации в январе 2014 года.

Хорошая новость заключается в том, что Googles traceur compiler уже поддерживает его, поэтому вы можете начать использоватьсегодня.

Пример синтаксиса:

async function asyncValue(value) {
  await timeout(50);
  return value;
}

async / await также включен в план TypeScript .

7 голосов
/ 09 октября 2011

Я не знаком с C #, но звучит так, будто вы ищете какое-то продолжение, так что вместо того, чтобы писать

fs.readFile 'foo.txt', (err, data) ->
  myFunc data

, вы могли бы просто написать что-то вроде

data = &fs.readFile 'foo.txt'  # not a real syntax
myFunc data

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

  • TameJS - на основе JavaScript, в основном просто добавляет эту функцию
  • Kaffeine - на основе JavaScript, добавляет набор функций
  • coco - на основе CoffeeScript

См. Также: Список компилируемых языковв JavaScript на вики-сайте CoffeeScript.

5 голосов
/ 03 июля 2012

Да, и вам даже не нужно его компилировать, потому что это простая библиотека JavaScript.

Один из моих проектов sharpnr.js нацелен на расширение JavaScript с помощью замечательных функций C # (и, конечно, .NET), таких как await / async или LINQ.

Библиотека в настоящее время находится в бета-версии, но она стабильна и поддерживает почти все операторы (например, loop, switch, если) и хорошо работает с существующими библиотеками (например, jQuery).

Синтаксис await / async практически идентичен версии C #:

var getAsync = async(function(url) {
  var result = await; $.get(url);
  $("#test").html(result);
});
getAsync("http://www.sharpnrjs.com");

Рабочий пример для jsfiddle .

Вы можете скачать библиотеку с github .

4 голосов
/ 11 июня 2013

Когда прибывает Узел 0,11 ( с v8 3.19 [1] , , который имеет генераторы [2] ), вы можете использовать Galaxy и код, как показано ниже.

Впрочем, только за флагом.Они изначально поддерживаются в ioJS .

function* countLines(path) {
    var names = yield fs.readdir(path);
    var total = 0;
    for (var i = 0; i < names.length; i++) {
        var fullname = path + '/' + names[i];
        if ((yield fs.stat(fullname)).isDirectory()) {
            total += yield countLines(fullname);
        } else {
            var count = (yield fs.readFile(fullname, 'utf8')).split('\n').length;
            console.log(fullname + ': ' + count);
            total += count;
        }
    }
    return total;
}

function* projectLineCounts() {
    var total = 0;
    total += yield countLines(__dirname + '/../examples');
    total += yield countLines(__dirname + '/../lib');
    total += yield countLines(__dirname + '/../test');
    console.log('TOTAL: ' + total);
    return total;
}
3 голосов
/ 27 октября 2016

хорошие новости ,

nodejs поддерживает его с v7.0.0 (ну, частично), все еще нуждается в флаге гармонии --harmony_async_await и, по-видимому, имеет некоторые ошибки, включая утечку памяти, для более подробной информации , но есть некоторые проблемы, связанные с ну, и один комментатор советует дождаться v8 версии 55, которая может быть недолгой.

3 голосов
/ 07 августа 2014

Вы можете включить асинхронное / ожидание в Google Chrome с включенным флагом Experimental JS, используя встроенные генераторы, обещания и крошечную функцию spawn () от Джейка Арчибальда :

spawn(function*() { //this function is async
      let story = yield getJSON('story.json'); //yield is like await
      addHtmlToPage(story.heading);
});

В качестве альтернативы вы можете использовать:

Для браузеров, не поддерживающих ES6, существует Facebook Regenerator .

2 голосов
/ 04 июня 2013

Для полноты: я обнаружил, что Saltarelle Compiler (который фактически компилирует C # в JavaScript) также поддерживает await / async.

1 голос
/ 11 декабря 2018

Javascript предоставляет функцию асинхронного ожидания с ECMA 7. Теперь можно ожидать всех асинхронных функций, обещая их и ожидая разрешения обещания. Большинство асинхронных функций, таких как вызовы БД, вызовы API, fs и события, теперь возвращаются в Javascript и nodeJs. Теперь с async-await код стал чище, понятнее, отлажен.

Пример

function timeout(){
  return new Promise( resolve => {
    setTimeout(function(){
      resolve(true);
    }, 5000);
  });
}

async function f(){
    let result = await timeout();
}
1 голос
/ 09 октября 2011

Если вас интересует асинхронное программирование в стиле .NET для JavaScript, вам следует изучить Rx для JavaScript.Rx для JavaScrpt - это порт JavaScript от React Framework от Microsoft.Реактивная структура описывается следующим образом:

Библиотека для составления асинхронных программ и программ, основанных на событиях, с использованием наблюдаемых коллекций и операторов запросов в стиле LINQ.JavaScript здесь

И вы можете прочитать об этом больше, включая примеры здесь

Вы также можете установить его на узле с помощью npm:

npm install rx

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

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