我是否可以指望每次调用doSomething()时都会完成nodeIDs映射?
nodeIDs = $.map(nodeIDs, function(n){
return n.match(/\d+$/);
});
doSomething(nodeIDs);
我认为node.js中的所有回调都是异步的?我读过一篇关于通用编程的文章,回调可能是同步的,但我不确定node.js?
答案 0 :(得分:42)
JavaScript也是一种函数式编程语言。你在这里有一个«高阶函数»,一个函数作为参数。高阶函数是同步的(但请参见下面的注释)。
来源:
map()
是高阶函数的典型示例。它需要一个函数并将其应用于数组的所有元素。这个定义听起来非常“功能性”。 Node也不提供此功能。它由MDN Array.prototype.map()记录并由ECMAScript 5.1指定。
要回答您的问题:是的,在所有元素都已应用后,doSomething(nodeIDs)
被称为。
<小时/> 注意:高阶函数是函数式编程的概念。 JavaScript是功能性的,但也深深扎根于在浏览器或服务器上执行代码的实用性。我会说,例如
setTimeout()
不是更高阶函数,即使它将函数作为参数,因为setTimeout()
实际上并不是纯函数,因为它使用时间。纯粹的功能是永恒的。例如,map()
的结果不依赖于时间。这就是这个问题的真正含义。如果某些东西不依赖于时间,则可以同步执行。问题解决了。
感谢Simon挑战JavaScript中高阶函数的定义。
答案 1 :(得分:14)
是的,.map
是同步的。 “回调”并不意味着“异步”。
答案 2 :(得分:3)
导入async
模块以实现异步&#39; map
&#39;方法
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);
}
答案 3 :(得分:0)
此函数是同步的 - 否则无法返回映射操作的结果。
任何可能需要更长时间(主要是由于IO)的回调在nodejs中都是异步的 - 除非该方法被明确标记为同步(例如fs.readFileSync
- 但不使用回调)。你可能会以某种方式混淆。
答案 4 :(得分:0)
使用论坛(是同步的):
let arr = ['fizz', 'buzz']
//example
for (const item of arr) {
//this Examp_func returns array
console.log((await Examp_func(item )).length);
}
答案 5 :(得分:-1)
答案 6 :(得分:-1)
是的,map 函数是异步的,是 ECMAScript 的一部分。 NodeJS 使用该定义中的 map。 尝试运行此代码以查看其运行情况。
componentDidUpdate(prevProps, prevState) {
const { data } = this.state;
if (prevState.data.date !== data.date) {
const startDate = new Date(data.date.startDate);
const endDate = new Date(data.date.endDate);
const countDuration = new Date(endDate - startDate).getDate();
this.setState({
data: {
...this.state.data,
duration: countDuration,
},
});
}
if (prevState.data.duration !== data.duration) {
const startDate = new Date(data.date.startDate);
const endDate = new Date(
startDate.setDate(startDate.getDate() + +data.duration - 1)
);
this.setState({
...this.state,
data: {
...this.state.data,
date: {
...this.state.data.date,
endDate: endDate,
},
},
});
}