Подтвердить что ты не робот

Async/ждет в веб-браузере или в node.js?

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

4b9b3361

Ответ 1

Я не знаком с С#, но похоже, что вы ищете какое-то продолжение, чтобы вместо написания

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.

Ответ 2

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

  • Async можно моделировать с помощью генераторов JS1.7 (см. task.js). Еще не поддерживается вне коробки V8 (без экспериментального режима), но работает в FF. Возможно, traceur или компилятор Masacra может использоваться для приведения генераторы в другие среды.
  • Существует node-fibers библиотека, предоставляющая другой механизм для асинхронного программирования в node (хотя это сказывается на производительности). Другие попытки, основанные на v8cgi, описаны здесь здесь.
  • Rhino имеет continuations, предоставляя хорошую альтернативу. Вот почему Ringo.js может стоить посмотреть.
  • Доступны несколько решений на основе перевода js2js, например: jscx, NarrativeJS, jwacs, StratifiedJS. Некоторая поддержка интеграции с node.
  • Есть много перспективных/будущих библиотек, пытающихся решить проблему обратных вызовов без расширения синтаксиса, однако все они страдают от проблем с возможностью слияния, т.е. не могут использовать языковые конструкции, такие как циклы между обратными вызовами.

Ответ 3

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

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

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

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

async/await также находится в TypeScript дорожной карте.

Ответ 4

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

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

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

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

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

Рабочий пример на jsfiddle.

Вы можете загрузить библиотеку из github.

Ответ 5

Когда Node 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;
}

Ответ 6

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

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

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

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

Ответ 7

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

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

Ответ 8

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

Ответ 9

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

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

Вы можете скачать Rx для JavaScript здесь

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

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

npm install rx

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

Ответ 10

есть https://github.com/loveencounterflow/coffy-script, который является попыткой добавить yield в CoffeeScript. CoffyScript очень новенький, и, поскольку я пишу это, я размышляю над трудностями, связанными с тем, что require.extensions является глобальным, и должен ли я быть отдельным расширением. что CoffyScript действительно работает, и вы найдете на моей странице github многочисленные примеры, которые показывают, как писать довольно сжатый асинхронный код с помощью suspend, resume и yield.

учитывая, что yield прибыл в NodeJS 11.2, я считаю, что нам следует исследовать, как использовать генераторы/сопрограммы, чтобы сделать асинхронное программирование более приемлемым. я для одного выбросили promises, опыт с ними не был таким приятным. Опять же, это может занять некоторое время, прежде чем yield станет доступным во всех основных браузерах.

Ответ 11

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();
}