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

내가 돈 '쓸 수 t이 알고 약속하는 카레 및 흐름 lodash 생각합니다. 그리고 나는 그들이 테이블에 무엇을 추가했는지 확실하지 않습니다. 일반 함수로 저장 한 경우 ID가 캡처됩니다 (작업 완료). – Keith

+0

"다시 돌려 줄 수 없다"는 것은 무엇을 의미합니까? 내가 아는 한'validateAsync' 함수는 id를 만족시키는 약속을 반환합니다. 문제가 어디 있습니까? 어쩌면 우리에게 더 많은 코드를 보여줄 수 있습니다. – Bergi

+0

@Bergi'validateAsync'의 코드를 포함 시켰습니다. 도움 주셔서 감사합니다. – Anas

답변

1

가장 간단한 선택은 의 정의에 _.flow을 사용하지 않는 것입니다. id 통과

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

우리는 또한 validateAsync을 변경할 수 있습니다 : 매개 변수를 사용하거나 그 결과를 가지고하지 않습니다 validateAsync 이후
, 당신은 단지 _.flow 사용하지 save의 정의를 변경해야

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 더에서 그 구도를 시도 할 수 있습니다)
그래서 하나가

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

당신은 composition을 사용하여'id'를 전달할 방법이 없다고 생각합니까? (저는 여전히 fp를 배우고 있습니다). – Anas

+0

@Anas 수정 사항을 확인하십시오. 컴포지션을 사용하려면'validateAsync'를 통해'id'를 전달할 수있는 방법이 필요합니다. 'validateAsync'의 큰 문제점은 순수하지 않고 (부작용에만 부름) 인수를 취하지 않기 때문에 매우 잘못 작성된다는 것입니다. – Bergi

+0

설명에 감사드립니다. – Anas