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

我不认为lodash咖喱和流量都答应知道。而且我不确定他们添加到桌面上,即使他们是。如果您保存为正常功能,则会捕获该ID(完成任务)。 – Keith

+0

你是什么意思“你不能退还”?据我可以看到你的'validateAsync'函数确实返回一个符合id的promise。你的问题在哪里?也许向我们展示更多你的代码。 – 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看到编辑。如果你想使用组合,你需要通过'validateAsync'或'around validateAsync'传递'id'。 “validateAsync”的一个大问题是它不是纯粹的(仅用于副作用)并且没有参数,这使得它非常糟糕 – Bergi

+0

非常感谢您的解释。 – Anas