0

С учетом приведенного ниже кода, как я могу передать id в applySaveAsync функция?Передача аргументов во время работы lodash flow асинхронно

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, но я не могу вернуть его обратно, так как validateAsync должен вернуть обещание.

Любой способ достичь этого?

+0

Я не»т думаю lodash карри и потоком данных обещают в курсе. И я не уверен, что они добавляют к столу, даже если бы они были. Если вы сохранили как обычную функцию, идентификатор будет захвачен (выполненная работа). – Keith

+0

Что значит «вы не можете вернуть его обратно»? Насколько я вижу, ваша функция validateAsync возвращает обещание, которое соответствует идентификатору. Где твоя проблема? Возможно, покажите нам больше своего кода. – Bergi

+0

@Bergi Я включил код 'validateAsync'. Спасибо за вашу помощь – Anas

ответ

1

Самый простой выбор - не использовать _.flow для определения validateAsync.
Поскольку validateAsync не принимает параметров и не имеет результата, вы должны просто изменить определение save не использовать _.flow:

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

Мы также могли бы изменить validateAsync пройти через id:

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

Вы думаете, что нельзя использовать композицию 'id'? (Я все еще изучаю fp). – Anas

+0

@Anas см. Редактирование. Если вы хотите использовать композицию, вам нужно каким-то образом передать идентификатор «id» или «validateAsync». Большая проблема 'validateAsync' заключается в том, что она не является чистой (называется только для побочных эффектов) и не принимает аргумента, что делает ее очень плохой. – Bergi

+0

Большое спасибо за ваше объяснение. – Anas