[英]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)
。
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);
}
是的, 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.