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