3

コレクションで非同期メソッドを実行できるアンダースコアに似たフレームワークはありますか。

_.each(collection, itemCallback, doneCallback) のようなもの。

例えば:

_.each(items, function(item, token){
    item.someProperty = null;
  }, function(err){
     console.log("The loop is done");
  });

編集: async.js は実際には問題を解決しません。たとえば、次のコード

<script type="text/javascript" src="async.js"></script>
<script type="text/javascript">

var arr = ["a","b","c"];

async.forEach(arr, function(item, met){
    console.log(item);
},
function(err){
});
console.log("Done");

</script>

プリント abc 完了

Done abcを印刷したいのですが

私はアンダースコアのdefferでそれを行うことができますが、ラッパーなしでそれを行うことができる他のライブラリがあるかもしれません.

4

1 に答える 1

18

Async.jsモジュールがそのトリックを行います。あなたの例は速すぎて、実際に期待どおりに機能していることに完全に気付くことができません。実際の実行順序がわかるように、少し遅延を追加した例を次に示します。

async.each([0,1,2,3,4,5,6,7,8,9], function(item, callback) {
  setTimeout(function() {
    console.log('>', item);
    callback();
  }, 2 * Math.random() * 1000);
}, function(err) {
  console.log('> done');
});

console.log(':)');

そして出力:

:)
> 4
> 5
> 2
> 7
> 8
> 3
> 0
> 1
> 9
> 6
> done

また、実際に非同期で行うには、Web Workersの使用を検討してください。しかし今のところ、Async.js はqueueという名前の似たような (ただし実際の Web ワーカーではない) 簡単な方法を提供します:

var q = async.queue(function(item, callback) {
  setTimeout(function() {
    console.log('>>', item);
    callback();
  }, 2 * Math.random() * 1000);
}, 5);

q.drain = function() {
  console.log('>> done');
};

q.push([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);

console.log('B)');

そして出力:

B)
>> 1
>> 2
>> 5
>> 6
>> 4
>> 3
>> 0
>> 7
>> 8
>> 9
>> done

最終的に両方を同時に実行した場合の出力例は次のとおりです。

:)
B)
>> 2
> 3
>> 4
>> 1
> 8
>> 6
> 7
> 1
> 4
>> 3
> 0
> 2
>> 7
>> 5
> 6
> 5
> 9
> done
>> 8
>> 0
>> 9
>> done
于 2012-07-27T03:59:46.253 に答える