2017-08-01 79 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调用。它们并不是绝对必要的,但是在调用异步函数后避免意外运行更多代码的良好做法。

相关问题