web-dev-qa-db-ja.com

JavaScriptのmap()は同期ですか?

機能は:

[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);
        }
);

それを行う方法です。

15
user3815910

はい、マップは同期です。
これは高次関数であり、新しい関数を取得して、指定された配列に適用します。

一部の人々は、関数をmapへのパラメーターとして提供するため、イベントコールバック関数のように動作するはずですが、実際はそうではないと考えています。 map関数は、関数パラメーターを配列に適用するだけで、終了後にのみ、マップブロックの後に結果のコードの実行を継続します。

あなたの「期待される振る舞い」について-それはあなたが思うように機能しないだけです;)

42
funerr

「map()メソッドは、この配列内のすべての要素に対して提供された関数を呼び出した結果を持つ新しい配列を作成します。」

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

各アイテムに対してコールバックが呼び出され、ロジックが実行され、戻り値が新しい配列のアイテムとして設定されます。

0
Or Barmatz