javascript - react - ¿Async/await en el navegador web o en node.js?
await is only valid in async function (11)
Cuando llegue el Nodo 0.11 ( con v8 3.19 [1] , que tiene generadores [2] ), puede usar Galaxy y el código como se muestra a continuación.
Sin embargo, sólo detrás de una bandera. Son soportados de forma nativa en 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;
}
¿Hay algún intento de llevar la característica async / await de C # 5.0 a algún idioma que pueda compilarse en JavaScript (como CoffeScript)? (Por lo tanto, se puede utilizar en el navegador web o en node.js.)
Javascript está proporcionando la función async-await con ECMA 7. Ahora se puede esperar a todas las funciones asíncronas prometiéndoles y esperando que la promesa se resuelva. La mayoría de las funciones asíncronas, como las llamadas a la base de datos, las llamadas a la API, las fs y los eventos, están volviendo prometedoras ahora en Javascript y nodeJs. Ahora, con el código async-await es más limpio, comprensible y depurado.
Ejemplo
function timeout(){
return new Promise( resolve => {
setTimeout(function(){
resolve(true);
}, 5000);
});
}
async function f(){
let result = await timeout();
}
No estoy familiarizado con C #, pero parece que lo que estás buscando es algún tipo de continuación, por lo que en lugar de escribir
fs.readFile ''foo.txt'', (err, data) ->
myFunc data
en vez de eso, podrías escribir algo como
data = &fs.readFile ''foo.txt'' # not a real syntax
myFunc data
Esto no es algo que proporciona JavaScript o CoffeeScript. Sin embargo, hay varios otros compiladores que pueden hacer algo como esto:
- TameJS - basado en JavaScript, principalmente solo agrega esta característica
- Kaffeine - basado en JavaScript, agrega un montón de características
- coco - Basado en CoffeeScript
Vea también: Lista de idiomas que se compilan en JavaScript en la wiki de CoffeeScript.
Para completar: he encontrado que Saltarelle Compiler (que en realidad compila C # a JavaScript) también soporta await / async.
Puede tener async / await en Google Chrome con el indicador Experimental JS habilitado, usando los Generadores, Promesas y una pequeña función de spawn () de Jake Archibald :
spawn(function*() { //this function is async
let story = yield getJSON(''story.json''); //yield is like await
addHtmlToPage(story.heading);
});
Alternativamente, puede utilizar:
- Q con async () y spawn () por Kris Kowal
- Co de Visionmedia
- Esperable por Jonathan Ong
- Task.js por Mozilla
- Entonces-rendimiento por Forbes Lindesay
- Cuando por cujoJS
Para los navegadores que no son compatibles con ES6, existe Facebook Regenerator .
Sí, lo hay, y ni siquiera necesitas compilarlo, porque es solo una simple biblioteca de JavaScript.
Uno de mis proyectos, llamado sharpnr.js, tiene el objetivo de extender JavaScript con excelentes funciones de C # (y .NET, por supuesto) como await / async, o LINQ.
La biblioteca se encuentra actualmente en versión beta, pero es estable y admite casi todas las declaraciones (por ejemplo, bucles, switch, if) y funciona bien con las bibliotecas existentes (como jQuery).
La sintaxis de await / async es casi idéntica a la versión de C #:
var getAsync = async(function(url) {
var result = await; $.get(url);
$("#test").html(result);
});
getAsync("http://www.sharpnrjs.com");
Ejemplo de trabajo en jsfiddle .
Puedes descargar la biblioteca desde github .
Si está interesado en la programación asíncrona de estilo .NET para JavaScript, debe buscar en Rx para JavaScript. Rx for JavaScrpt es el puerto de JavaScript de Microsoft del Marco Reactivo. El marco reactivo se describe como:
Una biblioteca para componer programas asíncronos y basados en eventos utilizando colecciones observables y operadores de consulta de estilo LINQ.
Puedes descargar Rx para JavaScript here
Y puedes leer más sobre esto, incluyendo ejemplos here
También puedes instalarlo en el nodo con npm:
npm instalar rx
Funciona bien con bibliotecas como jQuery, sin embargo, no soy un programador de CoffeeScript, por lo que no estoy seguro de qué soporte hay para la interoperabilidad con otras bibliotecas de JavaScript en este idioma.
async / await parece venir en ECMAScript 7 . Esta proposal fue aceptada en la etapa 1 del proceso de especificación en enero de 2014.
La buena noticia es que el compilador traceur de Google ya lo admite, por lo que podría comenzar a usarlo hoy.
Sintaxis de muestra:
async function asyncValue(value) {
await timeout(50);
return value;
}
async / await también está en la hoja de ruta de TypeScript .
hay https://github.com/loveencounterflow/coffy-script que es el intento de agregar yield
a CoffeeScript. CoffyScript es muy nuevo y mientras escribo esto estoy reflexionando sobre las dificultades planteadas por require.extensions
es global, y si debo ser una extensión separada. dicho esto, CoffyScript funciona, y encontrará en mi página github numerosos ejemplos que muestran cómo escribir código asíncrono bastante conciso usando suspend
, resume
y yield
.
Dado que el yield
ha llegado a NodeJS 11.2, creo que deberíamos investigar cómo usar generadores / coroutines para hacer que la programación asíncrona sea más aceptable. Por mi parte, he lanzado promesas, la experiencia con ellas no ha sido tan agradable. Por otra parte, puede tomar un tiempo antes de que el yield
esté disponible en todos los navegadores principales.
Async está en la lista de características para la armonía de JavaScript. Hasta el momento hay numerosos intentos de proporcionar dicha funcionalidad en el navegador o en el nodo, aunque ninguno de ellos parece ser compatible con la propuesta de armonía:
- Async se puede simular con generadores JS1.7 (ver task.js ). Aún no es compatible con V8 ( sin modo experimental ), pero funciona en FF. Posiblemente el compilador Masacra o Masacra se pueda usar para llevar los generadores a otros entornos.
- Hay node-fibers biblioteca de node-fibers proporciona otro mecanismo para la programación asíncrona en el nodo (sin embargo, el rendimiento es grave). Otro intento basado en v8cgi se describe here .
- Rhino tiene continuations fuera de la caja que proporcionan una buena alternativa. Es por Ringo.js que vale la pena mirar Ringo.js .
- Pocas soluciones basadas en la traducción de js2js están disponibles, por ejemplo: jscx , NarrativeJS , jwacs , StratifiedJS . Algunos apoyan la integración con el nodo.
- Hay muchas bibliotecas prometedoras / futuras que intentan resolver el problema de las devoluciones de llamada sin extender la sintaxis, sin embargo, todas sufren problemas de composición, es decir, no pueden usar construcciones de lenguaje como bucles en las devoluciones de llamadas.
buenas noticias
nodejs lo admite desde v7.0.0 (bueno, parcialmente), todavía necesita una bandera de armonía --harmony_async_await
, y aparentemente tiene algunos errores, incluida la pérdida de memoria, para nearly , pero también hay algunas preocupaciones, y un comentarista advises esperar hasta Versión v8 55 que podría no ser larga.