2013-05-30 4 views
2

Использование Дюрандаль SPA есть в моей shell.js:Q решение для отсроченного AJAX и когда() сделано()

function activate() { 
    datacontext.getUser(user); 
    return datacontext 
     .primeData() 
     .then(boot) 
     .fail(failedInitialization); //return for durandal 
} 

THe загрузки() функция зависит от результата от DataContext. getUser (пользователь).

Я бы хотел получить учетные данные пользователя перед активацией. Если primeData() ничего не делает (на данный момент):

var primeData = function() { 
     return Q.all([]); 
       }; 

затем загрузки() не получает результат от DataContext:

var getUser = function(userObservable) { 
      userObservable(); 
      var options = 
      { 
       url: 'api/user', 
       type: 'GET', 
       datatype: 'json' 
      }; 

      return $.ajax(options).then(queryOk).fail(queryNotOk); 

      function queryOk(data) { 
       userObservable(model.user(data)); 
      } 

      function queryNotOk(data, textStatus) { 
       ... 
      } 
     }; 

Вопрос заключается в Как я могу использовать Q вместо JQuery-х $ .when() сделано():.

$.when(datacontext.getUser(user)).done(function() { 
      return datacontext 
       .primeData() 
       .then(boot) 
       .fail(failedInitialization); 
     }); 

ответ

2

Простейшая модификация вы могли бы сделать, чтобы использовать функцию Q себя «ассимилировать» Jquery «обещание, возвращенный getUser функции:

Q(datacontext.getUser(user)).done(function() { 
    return datacontext 
     .primeData() 
     .then(boot) 
     .fail(failedInitialization); 
}); 

Заметим, что поскольку Q обещает цепь, это можно сделать немного проще:

Q(datacontext.getUser(user)) 
    .then(datacontext.primeData) 
    .then(boot) 
    .fail(failedInitialization) 
    .done(); 

несколько лучшее решение было бы сделать это усвоение внутри самой getUser функции, так что она возвращает Q обещание вместо «обещания» JQuery:

function getUser(userObservable) { 
    userObservable(); 
    var options = { 
     url: 'api/user', 
     type: 'GET', 
     datatype: 'json' 
    }; 

    return Q($.ajax(options)).then(queryOk).fail(queryNotOk); 

    function queryOk(data) { 
     userObservable(model.user(data)); 
    } 

    function queryNotOk(data, textStatus) { 
     ... 
    } 
} 

datacontext.getUser(user) 
    .then(datacontext.primeData) 
    .then(boot) 
    .fail(failedInitialization) 
    .done();