延迟ajax和when()done()的Q解决方案

时间:2013-05-30 10:51:31

标签: durandal q

使用Durandal SPA我在 shell.js

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

boot()函数取决于 datacontext.getUser(user)的结果。

我希望在激活之前获取用户凭据。如果 primeData()没有做太多(目前):

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

然后 boot()无法从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()。done()

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

1 个答案:

答案 0 :(得分:2)

您可以进行的最简单的修改是使用Q函数本身来“同化”您的getUser函数返回的jQuery“承诺:

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 promise而不是jQuery“promise”:

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();