【问题标题】:Is map() in javascript synchronous?javascript中的map()是同步的吗?
【发布时间】:2021-09-29 01:30:05
【问题描述】:

功能是:

[1,2,3].map( function (item)
{
  console.log(item);
  //return 'something';
});

除非我取消注释

,否则我的预期行为只会得到 1 作为输出
//return 'something'

但我真的明白了

1
2
3

我做错了什么?

更新:

我正在使用 nodejs 进行测试。

我真的不明白。

var async = require("async");

[1,2,3].map( function (item)
{
      console.log(item);
      //return 'something';
}); 
async.map([1,2,3], function (item,callback)
    {
        console.log(item);
        //callback(null,true)
    }, function (err,result)
        {
            console.log(result);
        }
);

两者返回相同

1
2
3

我真的很想等到我得到一个返回或回调,直到下一个项目被执行。

已解决

async.mapSeries([1,2,3], function (item,callback)
    {
        console.log(item);
        //callback(null,true)
    }, function (err,result)
        {
            console.log(result);
        }
);

是这样做的方法。

【问题讨论】:

  • 为什么这是你的“预期行为”?
  • 您正在尝试哪个浏览器?对于谷歌浏览器,我在这两种情况下都得到了预期的结果。
  • 注意:map 为数组中的每个元素调用一次提供的回调函数。这是我在 Google chrome 调试器中得到的: [1,2,3].map( function (item) { console.log(item); //return 'something'; }) 1 VM63:4 2 VM63:4 3 VM63:4 [未定义,未定义,未定义] [1,2,3].map(函数(项目){console.log(项目);返回“某事”;})1 VM66:4 2 VM66:4 3 VM66: 4 [“某事”、“某事”、“某事”]

标签: javascript asynchronous map synchronous


【解决方案1】:

是的,地图是同步的。
这是一个高阶函数,它接受一个新函数并将其应用于给定的数组。

有些人认为,因为他们将函数作为参数提供给map,所以它“应该”像事件回调函数一样,但实际上并非如此。 map 函数只是将函数参数应用于数组,只有在它完成后,它才会继续执行在 map 块之后的结果代码。

至于你的“预期行为”——它只是不像你想象的那样工作;)

【讨论】:

    【解决方案2】:

    “map() 方法创建一个新数组,其结果是对该数组中的每个元素调用提供的函数。”

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map

    为每个项目调用回调,执行您的逻辑并将返回值设置为新数组中的项目。

    【讨论】:

    • 换句话说function map(f,xs){var out=[];for(var i=0;i<xs.length;i++)out.push(f(xs[i]));return out};map(function(x){return x+1},[1,2,3]);//=>[2,3,4]
    • 这是否意味着 map() 并行执行这些函数?
    • Array.map 同步执行回调。
    猜你喜欢
    • 2017-02-10
    • 2015-05-10
    • 2020-01-14
    • 2020-07-21
    • 2019-07-06
    • 1970-01-01
    • 2020-10-03
    • 2016-08-13
    相关资源
    最近更新 更多