Является ли Node.js Array.map() асинхронным?
Могу ли я рассчитывать на сопоставление идентификаторов узлов, каждый раз, когда вызывается doSomething()?
nodeIDs = $.map(nodeIDs, function(n){
return n.match(/\d+$/);
});
doSomething(nodeIDs);
Я думал, что все обратные вызовы в node.js являются асинхронными? Я прочитал статью об общем программировании, что обратный вызов может быть синхронным, но я не уверен насчет node.js?
7 ответов
JavaScript также является функциональным языком программирования. Здесь у вас есть "функция высшего порядка", функция, которая принимает функцию в качестве параметра. Функции высшего порядка являются синхронными (но см. Примечание ниже).
Источники:
map()
Типичный пример функции высшего порядка. Он берет функцию и применяет ее ко всем элементам массива. Определение звучит очень "функционально". Эта функция также не предоставляется Node. Это задокументировано MDN Array.prototype.map() и определено в ECMAScript 5.1.
Чтобы ответить на ваш вопрос: да, doSomething(nodeIDs)
вызывается после применения всех элементов.
Примечание. Функция высшего порядка является концепцией функционального программирования. JavaScript является функциональным, но также глубоко укоренился в практичности выполнения кода внутри браузера или на сервере. Я бы сказал что например
setTimeout()
не является функцией более высокого порядка, даже если она принимает функцию в качестве параметра, потому что setTimeout()
не совсем чисто функционально, потому что использует время. Чистая функциональность вне времени. Например, результат map()
не зависит от времени И это то, что этот вопрос на самом деле. Если что-то не зависит от времени, вы выполняете это синхронно. Задача решена.Спасибо Саймону за то, что он оспорил определение функции высшего порядка в JavaScript.
Да, .map
синхронно "Обратный вызов" не означает "асинхронный".
Импортировать async
модуль иметь асинхронныйmap
метод
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);
}
Эта функция является синхронной - в противном случае она не может вернуть результат операции карты.
Любые обратные вызовы, которые могут занять больше времени (в основном из-за ввода-вывода), являются асинхронными в nodejs - если только метод явно не помечен как синхронный (такой как fs.readFileSync
- но это не использует обратный вызов). Вы, наверное, как-то запутались.
Используйте forof (синхронно):
let arr = ['fizz', 'buzz']
//example
for (const item of arr) {
//this Examp_func returns array
console.log((await Examp_func(item )).length);
}
ДА, функция карты является асинхронной и является частью ECMAScript . NodeJS использует карту из этого определения. Попробуйте запустить этот код, чтобы увидеть его в действии.