nodejs

时间:2016-03-22 11:03:18

标签: javascript node.js promise es6-promise

说,我有以下代码(假设所有未定义的函数作为返回promise的异步任务):

app.post('/abc', (req, res) => {
    var project;
    getProject(req.body.projectId)
        .then((_projectData) => {
            //this data is required by other functions in this promise chain
            project = _projectData;
        })
        .then(()=>{
             return doSomething1(project)
         })
        .then(()=>{
             return doSomething2(project)
         })
        .then(()=>{
             return doSomething3(project)
         })
        .then(()=>{
             return res.status(200).send('Everything done.')
         })
        .catch((err) => {
             return res.status(500).send('Error occured.')
        })
});

现在,当请求到来时,项目将被设置为与该请求相关的项目数据。并且将调用doSomething1()。比方说,doSomething1()需要花费很多时间。同时第二个请求来了,调用了getProject(),然后项目变量就会改变。现在,当第二个请求的doSomething1()正在执行时,第一个请求的doSomething1()完成,doSomething2()被调用,但是使用不同的项目变量。

如何避免这种情况? 这类案件的最佳案例是什么?

(一种方法可能是将这个承诺链分解为2个承诺链,并将所有依赖项放在一个链中,以便每个请求具有不同的项目变量范围,并且在该范围内调用所有其他函数:

app.post('/abc', (req, res) => {
    getProject(req.body.projectId)
        .then((_projectData) => {
            //this data is required by other functions in this promise chain
            var project = _projectData;
            doSomething1(project).
               .then(()=>{
                   return doSomething2(project)
               })
               .then(()=>{
                   return doSomething3(project)
               })
              .then(()=>{
                  return res.status(200).send('Everything done.')
               })
               .catch((err) => {
                    return res.status(500).send('Error occured.')
               })
            })
        .catch((err) => {
             return res.status(500).send('Error occured.')
        })
});

但这看起来并不好,好像承诺链很大,并且有更多的依赖(比如doSomething1()的输出作为doSomething3()的输入),承诺链不会起作用因为它们的设计目的。

另一种方法可能是通过每个promise promise传递项目变量,但是它不可能,因为它可能是第三方模块函数,或者甚至为此目的更改函数的返回值也不能证明函数的合理性重用性。)

我在这里缺少什么?

0 个答案:

没有答案