2013-02-18 22 views
5

什么是解决以下控制流挑剔的最佳方式:有条件执行的回调

  1. 我只是想打电话给getSomeOtherData如果someData等于某个值/经过一些条件测试

  2. 在这两种情况下我总是想打电话给getMoreData

http.createServer(function (req, res) { 
    getSomeData(client, function(someData) { 
     // Only call getSomeOtherData if someData passes some conditional test 
     getSomeOtherData(client, function(someOtherData) { 
      // Always call getMoreData 
      getMoreData(client, function(moreData) { 
      res.end(); 
      }); 
     }); 
    }); 
});   

回答

3

没有很好的解决办法;我发现的最好的方法是制作一个本地功能,照顾剩下的常见工作,例如:

http.createServer(function (req, res) { 
    getSomeData(client, function(someData) { 
    function getMoreAndEnd() { 
     getMoreData(client, function(moreData) { 
     res.end(); 
     }); 
    } 

    if (someData) { 
     getSomeOtherData(client, function(someOtherData) { 
     getMoreAndEnd(); 
     }); 
    } else { 
     getMoreAndEnd(); 
    } 
    }); 
}); 
2

这是你想要的东西吗?

http.createServer(function (req, res) { 
    getSomeData(client, function(someData) { 
     function myFunction (callback) { 
      // Only call getSomeOtherData if someData passes some conditional test 
      if (someData) { 
       getSomeOtherData(client, function(someOtherData) { 
        // Do something. 
       }); 
      } 

      callback(); 
     } 

     myFunction(function() { 
      // Always call getMoreData 
      getMoreData(client, function(moreData) { 
       res.end(); 
      }); 
     }); 
    }); 
});