2017-08-01 77 views
0

如何修改下面的代碼,以便我可以確保在Process2.update或Process2.create完成後觸發Process3?

以下代碼的主要用途是我想讓

Process1完成。然後檢查id是否存在,如果是,則觸發Process2.update。如果不是,則觸發Process2.create。

一旦Process2完成,檢查cmd是否存在。如果是,則觸發Process3。如何一個接一個地觸發一個異步進程

run: function (req, res) { 
    if (req.session) { 
     const values = req.params.all(); 
     const id = values.id; 
     const cmd = values.cmd; 
     const param = _.omit(values, ['cmd', 'id']); 

     const cb1 = (e, d) => { 
     if (e) { 
      console.log(e); 
      res.status(400).send({ e }); 
     } else { 
      Process1(values); 
      res.status(200).send({ d }); 
     } 
     }; 
     const cd2 = (id, param, cb1) => { 
     if (id) { 
      Process2.update({ id }, param, cb1); 
     } else { 
      Process2.create(param, cb1); 
     } 
     }; 

     if (cmd) { 
     cd2(id, param, cb1, Process3(values, cmd)); 
     } 
     else { 
     cd2(id, param, cb1); 
     } 

    } else { 
     res.status(403).send({ e: 'Forbidden access.' }); 
    } 
    } 

試方法,通過以下,但不知道如何傳遞參數ID,則params到進程2和process3

let async = require('async'); 
const Process1 = (value, cb) => { 
    console.log("Process1()"); 
    console.log(value); 
    cb(null, value + 1); 
}; 
const Process2 = (value, cb) => { 
    console.log("value(): wait 5 sec"); 
    console.log(value); 
    cb(null, value+10); 
}; 
const Process3 = (value, cb) => { 
    console.log(value); 
    console.log("Process3(): wait 5 sec"); 
    cb(null, value+100); 
}; 
let Pro_1_2 = async.compose(Process2, Process1); 
let Pro_2_3 = async.compose(Process3, Process2); 
Pro_1_2(1, (e, r) => { 
    Pro_2_3(r, (error, result) => { 
     console.log(result); 
    }); 
}); 
+0

'Process1,2,3'是異步函數?他們答應了嗎? – alexmac

回答

0

你有沒有使用 「compose」,從async.js考慮?

const a = (data, cb) => { 
    var result = 'a'; 
    cb(null, result); 
}; 
const b = (data, id, cb) => { 
    var result = 'b'; 
    cb(null, result); 
}; 
const c = (data, cb) => { 
    // stuff to do with result 
}; 

var aThenC = async.compose(c, a); 
var bThenC = async.compose(c, b); 

if (useA) { 
    aThenC(data, (result) => { 
    // result from c 
    res.status(200).send(result); 
    }); 
} else { 
    bThenC(data, id, (result) => { 
    // result from c 
    res.status(200).send(result); 
    }); 
} 

在這種情況下,一個b是你的過程2分別創建和更新,以及ç是回調Process3,如果我理解正確。

編輯:您只需在組合功能上輸入初始參數(例如寄存器ID)。真正構成的是:a(b(c(param)))。該參數基本上是開始該過程所需的一切。以下功能的參數將在該功能之前設置。

我會在鍵盤上添加代碼以支持它。

+0

我真正想要的是過程1先運行。一旦完成,Process2.update或Process2.create運行取決於id是否存在。一旦Process2完成,如果存在cmd,Process3運行 – jacobcan118

+0

@ jacobcan118那麼,您也可以使用類似的方法撰寫Process1到Process2的創建或更新,然後編寫Process3,不是嗎? –

0

您在原始問題中發佈的代碼似乎很扭曲,所以我不打算重寫它,但是一般情況下,如果要執行互相依賴的異步調用,async.auto是一個好主意要走的路。不是在頂部聲明變量,而是嘗試通過某些函數調用進行變異,最好使Process1,Process2Process3異步函數使用新的values對象調用其回調函數。例如:

async.auto({ 

    doProcess1: function(cb) { 
    // Assuming Process1 calls `cb(undefined, newValues)` when done. 
    Process1(values, cb); 
    return; 
    }, 

    doProcess2: ['doProcess1', function(results, cb) { 
    if (results.doProcess1.id) { 
     Process2.update({id: results.doProcess1.id}, cb); 
     return; 
    } else { 
     Process2.create(_.omit(results.doProcess1, ['cmd', 'id']), cb); 
     return; 
    } 
    }], 

    doProcess3: ['doProcess2', function(results, cb) { 
    if (results.doProcess2.cmd) { 
     Process3(results.doProcess2, cb); 
     return; 
    } 
    else { 
     cb(undefined, results.process2); 
     return; 
    } 

    }] 

}, function afterProcess3(err, results) { 
    // Handler err or process final results. 
}); 

請注意所有return調用。它們並不是絕對必要的,但是在調用異步函數後避免意外運行更多代碼的良好做法。

相關問題