È Node.js Array.mappa() asincrona?

Posso contare su di nodeIDs mappatura è completato ogni volta doSomething() viene chiamato?

nodeIDs = $.map(nodeIDs, function(n){
    return n.match(/\d+$/);
});
doSomething(nodeIDs);

Ho pensato a tutte le richiamate in node.js sono asincrone? Ho letto un articolo su di programmazione generale richiamata potrebbe essere sincroni, ma non sono sicuro node.js?

  • che cosa è di $ qui? mappa assume una funzione di callback da applicare a ogni membro della lista, non un callback quando completa iterazione è completa.
  • Grazie chovy. Per quanto riguarda i $, stavo sperimentando con il nodo-jquery modulo e non si preoccupò di modifica che fuori.
InformationsquelleAutor bonchef | 2012-10-06

 

6 Replies
  1. 45

    JavaScript è anche un linguaggio di programmazione funzionale. Quello che hai qui è un «ordine superiore ” funzione», una funzione che prende una funzione come parametro. Di ordine superiore funzioni sono sincroni (ma vedi nota sotto).

    Fonti:

    map() è un tipico esempio di una funzione di ordine superiore. Si prende una funzione e si applica a tutti gli elementi di un array. La definizione suona molto «funzionale». Questa funzione non è anche fornito dal Nodo. Essa è documentata da MDN Array.prototipo.mappa() e specificato da ECMAScript 5.1.

    Per rispondere alla tua domanda: Sì, doSomething(nodeIDs) è chiamato dopo tutti gli elementi sono stati applicati.


    Nota: di ordine superiore funzione è un concetto di programmazione funzionale. JavaScript è funzionale, ma anche profondamente seduti nella praticità di esecuzione del codice all’interno di un browser o sul server. Direi che, per esempio, setTimeout() non è una funzione di ordine superiore, anche se si prende una funzione come parametro perché setTimeout() non è davvero puramente funzionale, perché si utilizza il tempo. Pura funzionalità è senza tempo. Per esempio il risultato di map() non dipendono dal tempo. Ed è quello che questa domanda è veramente. Se qualcosa non dipendono dal tempo di eseguirlo in modo sincrono. Problema risolto.

    Grazie a Simone per contestare la definizione di ordine superiore funzione in JavaScript.

    • Grazie nalply. Guardando l’implementazione di riferimento della mappa() aiuta.
    • di ordine Superiore funzioni sono sincroni – davvero? setTimeout è anche un ordine superiore funzione, ma è asincrona.
    • Si dispone di un punto. Se si definiscono rigorosamente di funzioni che funzioni come parametri di «ordine superiore», quindi le funzioni asincrone sono anche «di ordine superiore». Che cosa si sarebbe chiamata sincrona funzioni che funzioni come parametri?
    • Non abbiamo mai guardato asincronia nella Programmazione Funzionale, non può che contribuire con un termine qui. Io non sono nemmeno sicuro se è importante il concetto di programmazione funzionale se una funzione è asincrona o non. Chiedo che cosa specialisti avrebbe risposto 🙂
    • E, in base al testo, ho il sospetto che sono Svizzero e di lavoro su Linux, perché ha il miglior layout di tastiera con Guillemets 😀
    • sì, io sono Svizzero e utilizzare la Svizzera tastiera su OS X.

  2. 15

    Sì, .map è sincrono. “Callback” non implica “asincrona”.

    • Grazie Charmander. Intendevo dire ‘quando in dubbio, assumere callback può essere chiamato in modo asincrono in un momento diverso’. Quindi la vera domanda è (vedi i miei commenti sopra) – in generale, come faccio a capire se una data funzione di libreria è asincrona o no?
    • Il node.js funzioni di File, per esempio, sono ben documentati, ma altri, come matrice di mappatura non riesco a trovare questo particolare pezzo di informazioni.
    • Ecco perché non sono forniti da un Nodo. Appartengono al V8 di runtime. V8 implementa ECMAScript. Array.map() è documentato qui: developer.mozilla.org/en-US/docs/JavaScript/Reference/….
  3. 3

    importare il async il modulo per avere un asincrono ‘map‘ metodo

    var async = require('async');
    
    var arr = ['1','2'];
    async.map(arr, getInfo, function (e, r) {
      console.log(r);
    });
    
    function getInfo(name, callback) {
      setTimeout(function() {
        callback(null, name + 'new');
      }, 1000);
    }
  4. 0

    Questa funzione è sincrona – altrimenti non potrebbe restituire il risultato dell’operazione di mapping.

    Tutte le funzioni di callback che potrebbe richiedere più tempo (a causa soprattutto IO) sono asincrone in nodejs – a meno che il metodo è esplicitamente indicati come sincrona (come fs.readFileSync – ma che non fa uso di un callback). Probabilmente confuso che, in qualche modo.

    • Grazie ThiefMaster. Ho capito la parte di Sincronizzazione e Asincrone versioni di funzioni IO e sono utilizzati nel passato. A riformulare la mia domanda meglio: dato un segmento di codice, quando non c’è richiamate, posso assumere flusso sincrono. Ma quando ci sono richiamate, non c’è modo ovvio per confermare un modo o l’altro? Se IOs sono coinvolti probabile che asincrono. Ma nella mappa() caso non ero così sicuro – né nodejs né il Javascript riferimenti sembrano specificare che. Così come posso dire per la prossima funzione di libreria di incontro?
    • I documenti di stato. E. g. nodejs.org/api/fs.html#fs_fs_rename_oldpath_newpath_callback “asincrona rinominare”
  5. 0

    utilizzare un forof (sincrono):

    let arr = ['fizz', 'buzz']
    //example
        for (const item of arr) {
       //this Examp_func returns array
         console.log((await Examp_func(item )).length);
        }

Lascia un commento