2017-08-01 4 views
0

次のコードをどのように修正する必要があるので、Process2.updateまたはProcess2.createの完了後にProcess3がトリガされるようにすることはできますか?

次のコードの主な目的は、

Process1を完成させたいです。次にidが存在するかどうかを確認し、存在する場合はProcess2.updateがトリガーされるようにします。そうでなければ、Process2.createがトリガーされます。

Process2が終了したら、cmdが存在するかどうかを確認します。 YESの場合、Process3をトリガします。私は、引数のIDを渡すことができるかどうかはわかり以下ではなくによって非同期プロセスを次々にトリガする方法

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.' }); 
    } 
    } 

トライアプローチ、プロセス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

へのparamsあなたはasync.jsから、 "compose" を使用して考えられていますか?このシナリオでは

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); 
    }); 
} 

aとb は、あなたのプロセス2は、それぞれ、作成および更新されている、と私は正しく理解している場合Cは、Process3へのコールバックです。

EDIT:作成した関数に初期パラメータ(例:レジスタID)を入力するだけで済みます。実際に行うことは、a(b(c(param)))です。そのparamは基本的にプロセスを開始するために必要なすべてです。以下の関数のパラメータは、その前に関数内で設定されます。

私はキーボードを操作するとすぐにそれをサポートするコードを追加します。

+0

私が本当に望むのは、プロセス1が最初に実行されることです。完了したら、Process2.updateまたはProcess2.createはidが存在するかどうかに依存して実行されます。 Process2が完了したらProcess3が実行されます。 – jacobcan118

+0

@ jacobcan118同様に、Process1とProcess2を作成または更新してProcess3を作成することもできます。 –

0

元の質問に投稿したコードはかなり歪んでいるようですので、書き直すつもりはありませんが、お互いに依存する非同期呼び出しを実行する場合は、一般的にはasync.autoが良いです行く道。上の変数をいくつかの関数呼び出しで変更しようとするのではなく、Process1Process2およびProcess3の非同期関数が、新しい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に注意してください。厳密には必要ではありませんが、非同期関数を呼び出した後に誤ってコードを実行することを避けることをお勧めします。

関連する問題