Есть ли попытка принести функцию async/await из С# 5.0 на любой язык, который может быть скомпилирован на JavaScript (например, CoffeScript)? (Поэтому его можно использовать либо в веб-браузере, либо в node.js.)
Async/ждет в веб-браузере или в node.js?
Ответ 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);
});
В качестве альтернативы вы можете использовать:
- Q с помощью async() и spawn() от Kris Kowal
- Co by Visionmedia
- Ожидается Джонатаном Онг
- Task.js от Mozilla
- Затем выдается Forbes Lindesay
- Когда cujoJS
Для браузеров, не поддерживающих 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();
}