2011-10-09 14 views
22

C'è qualche tentativo di portare la funzione asincrona/attesa da C# 5.0 a qualsiasi linguaggio che può essere compilato su JavaScript (come CoffeScript)? (Quindi può essere utilizzato nel browser Web o in node.js.)Async/await nel browser web o in node.js?

+2

In-browser JavaScript e JavaScript tramite node.js hanno il proprio modo di fare la programmazione asincrona. Starai molto meglio semplicemente imparando come funziona e usandolo come previsto invece di provare a forzarlo in un modello diverso (che è probabilmente completamente impossibile in ogni caso). – Pointy

+9

@Pointy: le attività di C# 5 sono un involucro sintattico attorno allo stesso modello di callback. Sono ** molto ** più facili da usare rispetto ai callback, in qualsiasi lingua. – SLaks

+0

OK Ovviamente rimando all'esperienza più ampia :-) – Pointy

risposta

7

Non ho familiarità con C#, ma sembra che quello che stai cercando sia una sorta di continuazione, in modo che invece di scrivere

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

si potrebbe invece basta scrivere qualcosa di simile

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

Questo non è qualcosa che fornisce JavaScript o CoffeeScript. Tuttavia, ci sono molti altri compilatori che possono fare qualcosa di simile:

  • TameJS - basato su JavaScript, principalmente solo aggiunge questa funzione
  • Kaffeine - basato su JavaScript, aggiunge un sacco di caratteristiche
  • coco - CoffeeScript-based

Vedere anche: List of languages that compile to JavaScript nel wiki di CoffeeScript.

+0

+1 Thx, come si fa in coco? –

+1

Cerca "[backcall] (https://github.com/satyr/coco/wiki/additions)" nella wiki di Coco. Usa un operatore '<-'. –

+2

Posso menzionare che aggiungere una sintassi di questo tipo a javascript ha un intero set di negativi, come doversi fidare del codice compilato, dover comprendere il codice compilato, dover eseguire il debug del codice compilato e tentare di abusare di schemi di progettazione sincroni in un asincrono ambiente.fondamentalmente sono astrazioni che possono facilmente fuoriuscire a meno che tu non sappia esattamente cosa stai facendo e io credo che solo l'autore del modulo e un piccolo numero di persone sappiano esattamente cosa stanno facendo – Raynos

1

Se si è interessati alla programmazione asincrona in stile .NET per JavaScript, è necessario esaminare Rx per JavaScript. Rx per JavaScrpt è la porta JavaScript di Microsoft di Reactive Framework. Il quadro reattivo è descritto come:

Una biblioteca per comporre i programmi asincroni e basati su eventi utilizzando collezioni osservabili e operatori di query LINQ in stile.

È possibile scaricare Rx per JavaScript here

E si può leggere di più su di esso, inclusi esempi here

È anche possibile installare sul nodo con NPM:

NPM installare rx

funziona siamo Con librerie come jQuery, comunque non sono un programmatore CoffeeScript, quindi non sono sicuro di quale supporto ci sia per l'interoperabilità con altre librerie JavaScript in questa lingua.

+0

Rx per JavaScript fornisce la funzione asincrona/attesa? –

16

Async è nell'elenco delle funzionalità per l'armonia JavaScript. Finora ci sono numerosi tentativi di fornire tale funzionalità nel browser o nel nodo, nessuno di loro sembra essere compatibile con la proposta armonia però:

  • Async può essere simulato con generatori JS1.7 (vedi task.js). Non ancora supportato immediatamente da V8 (without experimental mode), ma funziona in FF. È possibile utilizzare il compilatore traceur o Masacra per portare i generatori in altri ambienti.
  • C'è la libreria node-fibers che fornisce un altro meccanismo per la programmazione asincrona nel nodo (scarifica comunque delle prestazioni).Altri tentativi basati su v8cgi sono descritti con here.
  • Rhino ha continuations fuori dalla scatola che fornisce una buona alternativa. Questo è il motivo per cui vale la pena guardare Ringo.js.
  • Sono disponibili poche soluzioni basate sulla traduzione di js2js, ad esempio: jscx, NarrativeJS, jwacs, StratifiedJS. Alcuni supportano l'integrazione con il nodo.
  • Esistono molte librerie promettenti/future che tentano di risolvere il problema dei callback senza estendere la sintassi, tuttavia tutti hanno problemi di componibilità, cioè non possono usare costrutti di linguaggio come loop attraverso i callback.
+0

+1 Grazie per ulteriori informazioni. –

5

Sì, c'è, e non è nemmeno necessario compilarlo, perché è solo una semplice libreria JavaScript.

Uno dei miei progetti chiamato sharpnr.js ha lo scopo di estendere JavaScript con grandi funzionalità di C# (e .NET ovviamente) come Wait/Async, o LINQ.

La libreria è attualmente in versione beta, ma è stabile e supporta quasi tutte le istruzioni (ad esempio loop, switch, if) e funziona bene con le librerie esistenti (come jQuery).

La sintassi/asincrono await è quasi identica alla versione C#:

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

esempio Lavorare su jsfiddle.

È possibile scaricare la libreria da github.

2

Per completezza: ho trovato che Saltarelle Compiler (che in realtà compila C# in JavaScript) supporta anche attendere/asincrono.

4

Quando arriva il nodo 0.11 (with v8 3.19 [1], which has generators[2]), è possibile utilizzare Galaxy e codice come di seguito.

Tuttavia, solo dietro una bandiera. Sono supported natively in 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; 
} 
+0

+1 Thx, per la soluzione in node.js e, auspicabilmente, browser moderni :) –

0

c'è https://github.com/loveencounterflow/coffy-script che è il tentativo di aggiungere yield a CoffeeScript. CoffyScript è molto nuovo e mentre sto scrivendo questo sto riflettendo sulle difficoltà poste da require.extensions essendo globale e se dovrei essere un'estensione separata. Detto questo, CoffyScript funziona, e nella mia pagina di Github troverete numerosi esempi che mostrano come scrivere codice asincrono piuttosto succinto usando suspend, resume e yield.

dato che yield è arrivato in NodeJS 11.2, credo che dovremmo ricercare come utilizzare generatori/coroutine per rendere più appetibile la programmazione asincrona. io per primo ho buttato via le promesse, l'esperienza con loro non è stata così piacevole. Quindi, potrebbe essere necessario un po 'di tempo prima che lo yield diventi disponibile in tutti i principali browser.

3

Si può avere async/attendono in Google Chrome con Sperimentale JS bandiera abilitato, utilizzando built-in generatori, Promesse e una piccola spawn() function by Jake Archibald:

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

In alternativa, è possibile utilizzare:

Per i browser che non supportano ES6, c'è Facebook Regenerator.

13

async/await sembra essere coming in ECMAScript 7. Questo proposal è stato accettato nella fase 1 del processo di specifica nel gennaio 2014.

La buona notizia è che Googles traceur compiler già lo supporta, quindi è possibile iniziare a utilizzarlo oggi.

Sintassi di esempio:

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

asincrone/await è anche sul TypeScript roadmap.

+0

Nel caso in cui qualcuno desideri un collegamento diretto alla bozza di proposta https://tc39.github.io/ecmascript-asyncawait/ –

+2

l'attesa è finita con il nodo v7.0.0, bene [quasi] (https://github.com/nodejs/promises/issues/4#issuecomment-251025934) – mido

3

buona notizia,

nodejs lo sostiene da v7.0.0 (beh, in parte), ancora bisogno di una bandiera di armonia --harmony_async_await, ea quanto pare ha alcuni bug tra cui perdita di memoria, per more details, ma ci sono alcune preoccupazioni pure, e un commentatore advises aspettare fino alla versione v8 55 che potrebbe non essere lunga.

Problemi correlati