2012-10-06 35 views
21

¿Puedo contar con que la asignación de nodos se completa cada vez que se llama a DoSomething()?¿Noy es asincrónico Node.js Array.map()?

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

Pensé que todas las devoluciones de llamadas en node.js son asincrónicas? Leí un artículo sobre programación general de que la devolución de llamada podría ser sincrónica, pero no estoy seguro acerca de node.js?

+0

¿Qué es $ aquí? map toma una función de devolución de llamada para aplicar a cada miembro de la lista, no una devolución de llamada cuando se completa la iteración completa. – chovy

+0

Gracias chovy.En cuanto a $, solo estaba experimentando con el módulo node-jquery y no me molesté en editarlo. – bonchef

Respuesta

32

JavaScript es también un lenguaje de programación funcional. Lo que tienes aquí es una «función de orden superior», una función que toma una función como parámetro. Las funciones de orden superior son sincrónicas (pero vea la nota a continuación).

Fuentes:

map() es un ejemplo típico de una función de orden superior. Toma una función y la aplica a todos los elementos de una matriz. La definición suena muy «funcional». Esta función tampoco es proporcionada por Node. Está documentado por MDN Array.prototype.map() y especificado por ECMAScript 5.1.

Para responder a su pregunta: Sí, doSomething(nodeIDs) se llama después de todos los elementos se han aplicado.


Nota: La función de orden superior es un concepto de programación funcional. JavaScript es funcional, pero también está profundamente arraigado en la practicidad de ejecutar código dentro de un navegador o en el servidor. Diría que, por ejemplo, setTimeout() no es una función de orden superior, incluso si toma una función como parámetro porque setTimeout() no es realmente puramente funcional porque usa tiempo. La funcionalidad pura es intemporal. Por ejemplo, el resultado de map() no depende del tiempo. Y de eso se trata esta pregunta. Si algo no depende del tiempo, lo ejecuta sincrónicamente. Problema resuelto.

Gracias a Simon por desafiar la definición de la función de orden superior en JavaScript.

+0

Gracias nalply. Ver la implementación de referencia de map() ayuda. – bonchef

+0

* Las funciones de orden superior son síncronas * - ¿en serio? setTimeout también es una función de orden superior, pero es asíncrona. –

+0

@ SimonA.Eugster Tienes un punto. Si define estrictamente funciones que toman funciones como parámetros como «orden superior», las funciones asíncronas también son «de orden superior». ¿Cómo llamarías funciones sincrónicas que toman funciones como parámetros? – nalply

0

Esta función es síncrona; de lo contrario, no podría devolver el resultado de la operación del mapa.

Las devoluciones de llamada que pueden llevar más tiempo (principalmente debido a IO) son asincrónicas en nodejs, a menos que el método esté explícitamente marcado como síncrono (como fs.readFileSync) pero no utiliza una devolución de llamada. Probablemente confundiste eso de alguna manera.

+0

Gracias ThiefMaster. Comprendo la parte de las versiones Sync y Async de las funciones IO y las he usado en el pasado. Para volver a formular mi pregunta mejor: dado un segmento de código, cuando no hay devoluciones de llamada, puedo asumir el flujo síncrono. Pero cuando hay devoluciones de llamadas, ¿no hay una manera obvia de confirmar una vía u otra? Si las IO están involucradas, es probable que sean asincrónicas. Pero en el caso de map() no estaba tan seguro, ni nodejs ni las referencias de Javascript parecen especificar eso. Entonces, ¿cómo puedo saber para la próxima función de biblioteca que encuentro? – bonchef

+0

Los documentos lo indican. P.ej. http://nodejs.org/api/fs.html#fs_fs_rename_oldpath_newpath_callback "renombrar asíncronamente" – ThiefMaster

11

Sí, .map es sincrónico. "Devolución de llamada" no implica "asíncrono".

+1

Gracias Charmander. Quise decir 'en caso de duda, asumir que las devoluciones de llamada se pueden llamar de forma asíncrona en un momento diferente'. Así que la verdadera pregunta es (ver mis comentarios arriba) - En general, ¿cómo puedo saber si una función de biblioteca determinada es asincrónica o no? – bonchef

+0

Las funciones del archivo node.js, por ejemplo, están bien documentadas, pero otras, como la asignación de matrices, parece que no puedo encontrar esta información en particular. – bonchef

+0

Eso es porque no son proporcionados por Node. Pertenecen al tiempo de ejecución V8. V8 implementa ECMAScript. 'Array.map()' está documentado aquí: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/map. – nalply

3

importar el módulo async tener un 'map' método

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); 
} 
-1

Hay lib útil awaiting asíncrona. Y map te ayudará.

Cuestiones relacionadas