2013-02-18 5 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(); 
      }); 
     }); 
    }); 
}); 
Смежные вопросы