2

使用我的shell.js中的 Durandal SPA :

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()没有从数据上下文中得到结果:

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);
        }); 
4

1 回答 1

2

你可以做的最简单的修改是使用Q函数本身来“同化”你的getUser函数返回的 jQuery“promise:

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();
于 2013-06-09T03:55:13.683 回答