33

doSomething()が呼び出されるたびにノードIDのマッピングが完了することを期待できますか?

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()によって文書化され、 ECMAScript5.1によって指定されています。

あなたの質問に答えるために:はい、すべての要素が適用された後にdoSomething(nodeIDs)呼び出されます。


注:高階関数は関数型プログラミングの概念です。JavaScriptは機能的ですが、ブラウザー内またはサーバー上でコードを実行する実用性にも深く関わっています。たとえば、関数をパラメータとして受け取ったとしても、時間がかかるため純粋関数型ではないsetTimeout()ため、高階関数ではないと言えます。setTimeout()純粋な機能は時代を超えています。たとえば、の結果はmap()時間に依存しません。そして、それがこの質問の本当の意味です。何かが時間に依存しない場合は、同期して実行します。問題が解決しました。

JavaScriptの高階関数の定義に挑戦してくれたSimonに感謝します。

于 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

待っている便利なlibがあります。そして地図はあなたを助けます。

于 2017-07-17T12:52:15.707 に答える
-1

はい、マップ関数は非同期であり、ECMAScriptの一部です。NodeJSは、その定義のマップを使用します。このコードを実行して、実際の動作を確認してください。

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 に答える