durandal - 延迟ajax和when() did()的Q解决方案

标签 durandal q

使用我的 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);
        }); 

最佳答案

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

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

请注意,由于 Q promise 链,这可以变得更简单:

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

关于durandal - 延迟ajax和when() did()的Q解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16834229/

相关文章:

javascript - Knockout observable 绑定(bind)仅在第一次 ajax 调用后更新

javascript - 关于 $q 和 Promise 的困惑

javascript - Q.all block 中的所有功能均未得到 promise

javascript - 异步请求中的angularjs简单.then或$q服务

durandaljs - 单击按钮导航查看

facebook-javascript-sdk - 带有 Facebook SDK 的 HotTowel SPA

Javascript Q 库浏览器支持

javascript - 处理错误后跳过 promise 链

javascript - 停用后如何在 Durandal 中处理 View 模型

single-page-application - 如何将 Durandal.js 配置为在同一个文件夹中拥有多个具有 View 和 View 模型的区域?