2014-11-07 3 views
0

В nodejs много вызовов функций реализованы как неблокирующая функция. Иногда между этими вызовами функций могут быть зависимости. Например, при входе пользователя в систему, я хочу сначала получить пользовательский тип пользователя, а затем в соответствии с типом пользователя я могу получить задачи, которым просто назначен этот тип пользователя. В функции неблокирующем, я использую вложенный вызов функции: толькоРешить зависимость в вызове неблокирующей функции в узлах

$http.post(url_login, login_request) 
    .success(function(req) { 
      $http.post(url_get_tasks, req.type) 
       .success(function(req) { 
        //update tasks 
       }) 
    }) 

Много библиотек обеспечивают неблокируемому функции, например, node_redis библиотеки. Есть ли хороший способ обработки вложенных неблокирующих вызовов функций для решения проблемы зависимости.

+1

Посмотрите на модуль «асинхронного»: в особенно для функции «водопада». – matteo

ответ

1

Существует страница, посвященная этой конкретной проблемы: http://callbackhell.com/

чтобы подвести итог, у вас есть возможность

  • использовать именованные функции, as codebox suggests
  • использовать async библиотеку
  • или использование обещает

Если я не ошибаюсь, вы используете Угловое $http службу, которая должна поддерживать надлежащее обещание цепочки , поэтому вы можете уменьшить свой код до

$http.post(url_login, login_request) 
    .then(function(req){ 
     return $http.pos(url_get_tasks, req.type); 
    }) 
    .then(function(req){ 
     // update tasks 
    }) 
    .catch(function(err){ 
     // errors from the first AND second call land here 
    }) 

Вы можете написать свой собственный код еа простая обертка для асинхронных функций, чтобы превратить их в обещания:

// this assumes standard node.js callbacks with the 
// signature (error, data) 
function toPromise(fn){ 
    return function() { 
     var args = Array.prototype.slice.call(arguments); 
     var scope = this; 
     return new Promise(function(resolve, reject){ 
      var cb = function(err, data) { 
       return err ? reject(err) : resolve(data); 
      }; 
      args.push(cb); 
      fn.apply(scope, args); 
     }); 
    }; 
    } 

    // turn fs.readdir into a promise 
    var readdir = toPromise(require('fs').readdir); 
    readdir('.') 
    .then(function(files){ 
     console.log(files); 
    }) 
    .catch(function(err){ 
     console.log('reading files failed'); 
    }) 

Было еще один вопрос относительно угловых $http обещаний, которые могли бы помочь вам лучше понять их: here

0

Я не 100% уверен, что вы просите, но если вы хотите, чтобы уменьшить гнездящиеся в своем коде вы можете перемещать внутренние функции из так:

function success1(req) { 
    //update tasks 
} 
function success2(req) { 
    $http.post(url_get_tasks, req.type).success(success1) 
} 

$http.post(url_login, login_request).success(success2) 

, очевидно, вы должны выбрать лучшие имена, чем success1 хотя