33

每次调用 doSomething() 时,我可以指望 nodeIDs 映射完成吗?

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

我认为 node.js 中的所有回调都是异步的?我确实读过一篇关于一般编程的文章,回调可能是同步的,但我不确定 node.js?

4

7 回答 7

52

JavaScript 也是一种函数式编程语言。你这里有一个“高阶函数”,一个将函数作为参数的函数。高阶函数是同步的(但请参见下面的注释)。

资料来源:

map()是高阶函数的典型例子。它接受一个函数并将其应用于数组的所有元素。这个定义听起来很“实用”。Node 也不提供此功能。它由MDN Array.prototype.map()记录并由ECMAScript 5.1指定。

回答您的问题:是的,在应用所有元素doSomething(nodeIDs)调用。


注意:高阶函数是函数式编程的概念。JavaScript 是功能性的,但也深深植根于在浏览器或服务器上执行代码的实用性。我会说,例如setTimeout(),即使它将函数作为参数,它也不是高阶函数,因为setTimeout()它不是真正纯粹的函数,因为它使用时间。纯粹的功能是永恒的。例如,结果map()不取决于时间。这就是这个问题的真正意义所在。如果某些事情不依赖于时间,您可以同步执行它。问题解决了。

感谢 Simon 挑战 JavaScript 中高阶函数的定义。

于 2012-10-07T15:36:10.953 回答
16

是的,.map是同步的。“回调”并不意味着“异步”。

于 2012-10-06T20:33:48.917 回答
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);
}
于 2015-03-17T09:53:31.510 回答
2

这个函数是同步的——否则它不能返回映射操作的结果。

任何可能需要较长时间的回调(主要是由于 IO)在 nodejs 中都是异步的 - 除非该方法被明确标记为同步(例如fs.readFileSync- 但不使用回调)。您可能以某种方式混淆了这一点。

于 2012-10-06T20:33:30.193 回答
0

使用 forof (是同步的):

let arr = ['fizz', 'buzz']
//example
    for (const item of arr) {
   //this Examp_func returns array
     console.log((await Examp_func(item )).length);
    }
于 2019-06-07T19:10:21.710 回答
-1

是的,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)
})

于 2021-01-15T03:47:25.187 回答
-1

有有用的库在等待地图会帮助你。

于 2017-07-17T12:52:15.707 回答