Node.js是否Array.map()是异步的?

时间:2012-10-06 20:32:16

标签: javascript node.js asynchronous callback mapping

我是否可以指望每次调用doSomething()时都会完成nodeIDs映射?

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

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

7 个答案:

答案 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)

有用的库awaitingmap会帮助你。

答案 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,
      },
    },
  });
}