Является ли 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 использует карту из этого определения. Попробуйте запустить этот код, чтобы увидеть его в действии.

Другие вопросы по тегам