簡體   English   中英

Node.js Array.map() 是異步的嗎?

[英]Is Node.js Array.map() asynchronous?

我可以指望每次調用 doSomething() 時都完成 nodeIDs 映射嗎?

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

我認為 node.js 中的所有回調都是異步的? 我確實讀過一篇關於一般編程的文章,回調可以是同步的,但我不確定 node.js?

JavaScript 也是一種函數式編程語言。 你在這里擁有的是一個“高階函數”,一個將函數作為參數的函數。 高階函數是同步的(但請參見下面的注釋)。

資料來源:

map()是高階函數的典型例子。 它接受一個函數並將其應用於數組的所有元素。 這個定義聽起來很“功能性”。 Node.js 也沒有提供這個功能。 它由MDN Array.prototype.map() 記錄並由ECMAScript 5.1指定。

回答您的問題:是的,在應用所有元素調用doSomething(nodeIDs)


注意:高階函數是函數式編程的一個概念。 JavaScript 是功能性的,但也深深植根於在瀏覽器內或服務器上執行代碼的實用性。 我會說,例如setTimeout()不是高階函數,即使它接受一個函數作為參數,因為setTimeout()並不是真正的純函數,因為它使用時間。 純粹的功能是永恆的。 例如map()的結果不依賴於時間。 這就是這個問題的真正意義所在。 如果某些內容不依賴於時間,則同步執行它。 問題解決了。

感謝 Simon 挑戰 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);
}

此函數是同步的 - 否則無法返回映射操作的結果。

任何可能需要更長時間(主要是由於 IO)的回調在 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);
    }

有有用的 lib等待 地圖會幫助你。

是的, map函數是異步的,是ECMAScript 的一部分。 NodeJS 使用該定義中的 map。 嘗試運行此代碼以查看其運行情況。

 const array = ['first','second'] function name(params) { setTimeout( () => console.log('name: ' + params), 5000 ); } console.log('wait for 5 seconds') array.map(v => { name(v) })

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM