每次调用 doSomething() 时,我可以指望 nodeIDs 映射完成吗?
nodeIDs = $.map(nodeIDs, function(n){
return n.match(/\d+$/);
});
doSomething(nodeIDs);
我认为 node.js 中的所有回调都是异步的?我确实读过一篇关于一般编程的文章,回调可能是同步的,但我不确定 node.js?
每次调用 doSomething() 时,我可以指望 nodeIDs 映射完成吗?
nodeIDs = $.map(nodeIDs, function(n){
return n.match(/\d+$/);
});
doSomething(nodeIDs);
我认为 node.js 中的所有回调都是异步的?我确实读过一篇关于一般编程的文章,回调可能是同步的,但我不确定 node.js?
JavaScript 也是一种函数式编程语言。你这里有一个“高阶函数”,一个将函数作为参数的函数。高阶函数是同步的(但请参见下面的注释)。
资料来源:
map()
是高阶函数的典型例子。它接受一个函数并将其应用于数组的所有元素。这个定义听起来很“实用”。Node 也不提供此功能。它由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)
})