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?
risposta
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.
+1 Thx, come si fa in coco? –
Cerca "[backcall] (https://github.com/satyr/coco/wiki/additions)" nella wiki di Coco. Usa un operatore '<-'. –
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
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.
Rx per JavaScript fornisce la funzione asincrona/attesa? –
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.
+1 Grazie per ulteriori informazioni. –
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.
Per completezza: ho trovato che Saltarelle Compiler (che in realtà compila C# in JavaScript) supporta anche attendere/asincrono.
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;
}
+1 Thx, per la soluzione in node.js e, auspicabilmente, browser moderni :) –
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.
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:
- Q with async() and spawn() by Kris Kowal
- Co by Visionmedia
- Awaitable by Jonathan Ong
- Task.js by Mozilla
- Then-yield by Forbes Lindesay
- When by cujoJS
Per i browser che non supportano ES6, c'è Facebook Regenerator.
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.
Nel caso in cui qualcuno desideri un collegamento diretto alla bozza di proposta https://tc39.github.io/ecmascript-asyncawait/ –
l'attesa è finita con il nodo v7.0.0, bene [quasi] (https://github.com/nodejs/promises/issues/4#issuecomment-251025934) – mido
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.
- 1. Rilevamento ambiente: node.js o browser
- 2. come eseguire un'applet java nel browser web
- 3. Evidenziamento ortografico Controllo ortografia nel browser web
- 4. RStudio apre la documentazione nel browser web
- 5. equivalente pdb.set_trace() nel browser web javascript?
- 6. LinkLabel ... aperto nel browser Web predefinito?
- 7. Modulo comune in node.js e browser javascript
- 8. Apertura programmata di URL nel browser Web in Python
- 9. Aprire un URL nel browser Web predefinito in WinRT
- 10. Possiamo inserire javascript in qualsiasi pagina web caricata nel browser
- 11. Come mostrare rsync --progress nel browser web usando DJango?
- 12. Desidero utilizzare i comandi di tipo VI nel browser Web?
- 13. Puoi incorporare gli script Python nel browser web?
- 14. Perché questo SVG funziona visualizzato in modo raw nel browser ma non in una pagina Web?
- 15. Come sfruttare la cache del browser in node.js?
- 16. browser web sito timeout
- 17. Test dell'API Web utilizzando jasmine e node.js
- 18. Python - Flask - apre una pagina Web nel browser predefinito
- 19. Restituisce tutti gli attributi di un HtmlElement nel browser Web
- 20. Scrape le pagine Web in tempo reale con Node.js
- 21. Ricerca xpath in diretta nel browser
- 22. Ottenere java gui per aprire una pagina Web nel browser
- 23. Visualizzazione 3D nel browser
- 24. Reindirizzamenti di pagina Web di debug nel browser
- 25. Come ancorare gli strumenti di sviluppo nel browser Web Vivaldi?
- 26. pulsanti di zoom nel browser web di Android
- 27. Il browser Web CefSharp WPF non viene visualizzato o reso
- 28. Implementazione della crittografia Web JSON in Node.js
- 29. Plug-in Ruby per browser web?
- 30. URL nel Node.js
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
@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
OK Ovviamente rimando all'esperienza più ampia :-) – Pointy