5

私は関数型プログラミングの初心者であり、lodash主要な高階関数を理解するために推奨される人です。

lodash API のドキュメントを閲覧したところ、次のサンプル コードを把握できませんでした_.after()

var saves = ['profile', 'settings'];

var done = _.after(saves.length, function() {
  console.log('Done saving!');
});

_.forEach(saves, function(type) {
  asyncSave({ 'type': type, 'complete': done });
});
// → logs 'Done saving!', after all saves have completed

上記のサンプル コードでは が実装されていないasyncSave()ため、関数を自分で実装する必要があります。しかし、私はそれを実装する方法がわかりません。_.after()それ自体の仕様を理解していないからです。

API ドキュメントに書かれているよりも簡単に機能を説明してくれると助かります。または、関数のわかりやすく実用的な例が大きな助けになります。ありがとう!

4

1 に答える 1

11

_.after引数として countnと functionを取り、 ("f prime" に対して)f呼び出すことができる新しい関数を返します。fpこの関数fpは、呼び出された回数のカウントを保持するようなものです。呼び出された回数fpが 未満である限りn、呼び出しfpは何もしません (呼び出された回数を保持する以外は)。呼び出された回数fpが と等しいかそれ以上になるnと、fが呼び出されます。

そう:

var _ = require("lodash");
var fp = _.after(3, function () { console.log("OMG!"); });
fp(); // Nothing
fp(); // Nothing
fp(); // Prints "OMG!"

この関数asyncSaveは、特定のタイプのデータ (渡されたオブジェクトのフィールド) に対して非同期に保存操作を実行し、保存操作typeが完了すると、コールバック (complete渡されたオブジェクトのフィールド) を 1 回だけ呼び出すものになります。

したがって、_forEachループはasyncSaveアイテムごとに 1 回呼び出されます。つまり、アイテムごとにsaves1 つの保存操作が開始されsavesます。doneは のコールバックであるため、asyncSave最終的doneには保存操作ごとに 1 回呼び出されます。doneが で作成され、_.afterに渡されたカウントが_.afterに等しかったため、saves.lengthに渡された無名関数は、が回呼び出される_.afterまで実際には実行されません。つまり、この例で開始されたすべての保存操作が完了するまで呼び出されません。donesaves.length

于 2014-01-26T11:06:49.230 に答える