0

以下のコードでは、idapplySaveAsync関数に渡すにはどうすればよいですか?lodashフローを非同期に実行している間に引き数を渡す

var then = _.curry(function (f, thenable) { 
     return thenable.then(f); 
    }); 

    var validateAsync = _.flow(
     function() { return _(someCondition).showError(ERROR_01).value(); }, 
     then(function() { return _(anotherCondition).showError(ERROR_02).value(); }) 
    ); 

    var save = _.flow(
     validateAsync, 
     then(applySaveAsync), 
     then(saveCompleted) 
    ); 

    function applySaveAsync(id) { 
     // Saving... 
    } 

    save(22); // Calling save function with some id. 

私はvalidateAsync機能上のIDを得ることができますが、私は約束を返す必要がありますvalidateAsyncので、戻ってそれを返すことができません。

これを実現する方法はありますか?

+0

を書くことができるようにします。たとえ彼らがテーブルに追加したものであっても、私はそれが何であるか分からない。通常の関数として保存していた場合、IDが取得されます(ジョブ完了)。 – Keith

+0

「あなたはそれを元に戻すことができない」とはどういう意味ですか?あなたの 'validateAsync'関数がIDを満たす約束を返していることが分かります。あなたの問題はどこですか?たぶんあなたのコードをもっと見せてくれるでしょう。 – Bergi

+0

@Bergi私は 'validateAsync'のコードを含んでいます。あなたの助けをありがとう – Anas

答えて

1

最も簡単な選択は、validateAsyncの定義に_.flowを使用しないことです。
validateAsyncはパラメータを取るも、結果を持っていないので、あなただけの_.flowを使用しないようにsaveの定義を変更する必要があります。

function save(id) { 
    return validateAsync() 
    .then(function(){ return applySaveAsync(id) }) 
    .then(saveCompleted) 
} 

我々はまた、idを通過するvalidateAsyncを変更することができます:

function validateAsync(id) { 
    return _(someCondition).showError(ERROR_01).value() 
    .then(function() { return _(anotherCondition).showError(ERROR_02).value(); }) 
    .then(_.constant(id)); 
} 

でも、それでもなお使用しています。_.flow

var validateAsync = _.flow(
    function(id) { return _(someCondition).showError(ERROR_01).value().then(_.constant(id)); }, 
    then(function(id) { return _(anotherCondition).showError(ERROR_02).value().then(_.constant(id)); }) 
); 

しかし、validateAsyncはパラメータをとる関数ではないため、私はそれに反対します。

のは、私たちは、機能的な方法でパスアラウンドを行うようにする代わりに、このようなラッパー関数を書いてみましょう:

function pass(fn) { 
    return function(id) { 
     return fn().then(function() { 
      return id; 
     }); 
    } 
} 

(お好みであれば、あなたはthen_.constant、よりからそれを構成しようとすることができます)
1は、私はtはlodashカレー&フローが意識を約束していると思う「をドン

var save = _.flow(
    wrap(validateAsync), 
    then(applySaveAsync), 
    then(saveCompleted) 
); 
+0

あなたは構図を使って 'id'を渡す方法がないと思いますか? (私はまだfpを学んでいます)。 – Anas

+0

@Anas編集を参照してください。コンポジションを使用する場合は、 'validateAsync'の前後に' id'を渡す何らかの方法が必要です。 'validateAsync'の大きな問題は、純粋ではない(副作用のみと呼ばれる)引数を取らないことで、非常に悪い構成になります。 – Bergi

+0

ありがとうございました。 – Anas

関連する問題