doSomething()が呼び出されるたびにノードIDのマッピングが完了することを期待できますか?
nodeIDs = $.map(nodeIDs, function(n){
return n.match(/\d+$/);
});
doSomething(nodeIDs);
node.jsのすべてのコールバックは非同期だと思いましたか?コールバックは同期的である可能性があるという一般的なプログラミングに関する記事を読みましたが、node.jsについてはよくわかりませんか?
doSomething()が呼び出されるたびにノードIDのマッピングが完了することを期待できますか?
nodeIDs = $.map(nodeIDs, function(n){
return n.match(/\d+$/);
});
doSomething(nodeIDs);
node.jsのすべてのコールバックは非同期だと思いましたか?コールバックは同期的である可能性があるという一般的なプログラミングに関する記事を読みましたが、node.jsについてはよくわかりませんか?
JavaScriptは関数型プログラミング言語でもあります。ここにあるのは「高階関数」です。これは、関数をパラメーターとして受け取る関数です。高階関数は同期しています(ただし、以下の注を参照してください)。
出典:
map()
高階関数の典型的な例です。関数を受け取り、それを配列のすべての要素に適用します。定義は非常に「機能的」に聞こえます。この機能もNodeでは提供されていません。これは、 MDN Array.prototype.map()によって文書化され、 ECMAScript5.1によって指定されています。
あなたの質問に答えるために:はい、すべての要素が適用された後にdoSomething(nodeIDs)
呼び出されます。
setTimeout()
ため、高階関数ではないと言えます。setTimeout()
純粋な機能は時代を超えています。たとえば、の結果はmap()
時間に依存しません。そして、それがこの質問の本当の意味です。何かが時間に依存しない場合は、同期して実行します。問題が解決しました。
JavaScriptの高階関数の定義に挑戦してくれたSimonに感謝します。
はい、.map
同期しています。「コールバック」は「非同期」を意味するものではありません。
モジュールをインポートし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);
}
この関数は同期的です-そうでなければ、マップ操作の結果を返すことができませんでした。
(主にIOが原因で)時間がかかる可能性のあるコールバックは、nodejsでは非同期です-メソッドが明示的に同期としてマークされていない限り(fs.readFileSync
-などですが、コールバックは使用されません)。あなたはおそらくそれをどういうわけか混乱させました。
forofを使用します(同期です):
let arr = ['fizz', 'buzz']
//example
for (const item of arr) {
//this Examp_func returns array
console.log((await Examp_func(item )).length);
}
はい、マップ関数は非同期であり、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)
})