Подтвердить что ты не робот

Является Node.js Array.map() асинхронным?

Можно ли рассчитывать на сопоставление nodeIDs, когда каждый раз выполняется doSomething()?

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

Я думал, что все обратные вызовы в node.js асинхронны? Я прочитал статью об общем программировании, что обратный вызов может быть синхронным, но я не уверен в node.js?

4b9b3361

Ответ 1

JavaScript также является функциональным языком программирования. Здесь у вас есть функция "высшего порядка", функция, которая принимает функцию в качестве параметра. Функции более высокого порядка синхронны (но см. Примечание ниже).

Источники:

map() является типичным примером функции более высокого порядка. Он принимает функцию и применяет ее ко всем элементам массива. Определение звучит очень "функционально". Эта функция также не предоставляется Node. Он документирован MDN Array.prototype.map() и указан ECMAScript 5,1.

Чтобы ответить на ваш вопрос: Да, doSomething(nodeIDs) называется после. Все элементы были применены.


Примечание: Функция более высокого порядка представляет собой концепцию функционального программирования. JavaScript функциональный, но также глубоко уложен в практичности выполнения кода внутри браузера или на сервере. Я бы сказал, что, например, setTimeout() не является функцией более высокого порядка, даже если он принимает функцию как параметр, потому что setTimeout() на самом деле не является чисто функциональным, поскольку использует время. Чистая функциональность безвременна. Например, результат map() не зависит от времени. И это то, о чем этот вопрос действительно. Если что-то не зависит от времени, вы выполняете его синхронно. Проблема решена.

Спасибо Саймону за вызов определения функции более высокого порядка в JavaScript.

Ответ 2

Да, .map является синхронным. "Обратный вызов" не означает "асинхронный".

Ответ 3

импортируйте модуль 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);
}

Ответ 4

Эта функция синхронна - в противном случае она не может вернуть результат операции с картой.

Любые обратные вызовы, которые могут занимать больше времени (в основном из-за IO), являются асинхронными в nodejs - если метод явно не помечен как синхронный (например, fs.readFileSync - но не использует обратный вызов). Вероятно, вы что-то смутили.

Ответ 5

используйте forof (синхронно):

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

Ответ 6

Существует полезный lib awaiting. И map поможет вам.