在Durandal应用程序中与Q承诺挣扎

时间:2013-05-07 02:05:33

标签: breeze durandal q

在我的viewmodel的activate方法中,我有以下代码。

function activate() {
    var promise = Q.all([datacontext.getManufacturers(manufacturers)]);
    logger.log('Frames View Activated', null, 'frames', false);
    return promise;
}

在我的数据上下文代码中

var getManufacturers = function (manufacturerObservable) {
    var query = entityQuery.from('Manufacturers')
        .orderBy('name');

    return manager.executeQuery(query)
        .then(querySucceeded)
        .fail(queryFailed);

    function querySucceeded(data) {
         if (manufacturerObservable) {
             manufacturerObservable(data.results);
         }
         log('Retrieved [Manufacturer] from remote data source',
             data, false);
    }
};

我希望设置承诺的方式可以检索制造商,然后激活方法就完成了。我希望'从远程数据源检索[制造商]'日志消息发生在'帧视图激活'日志消息之前,但事实上恰恰相反。如何在激活方法完成之前完成数据检索?

2 个答案:

答案 0 :(得分:3)

在这种情况下,我认为你根本不需要Q. breeze数据管理器返回自己的承诺。

function activate() {
    logger.log('Frames View Activated', null, 'frames', false);
    return datacontext.getManufacturers(manufacturers);
}

这确保在激活功能返回之前,getManufacturer功能已完成。

但是,如果您希望在检索到的消息之后显示“已激活帧视图”,则可以使用promise.spread.then(function() {logger.log('Frames View Activated', null, 'frames', false); })promise.then(function() {logger.log('Frames View Activated', null, 'frames', false); })

答案 1 :(得分:2)

这里的问题似乎是,当breeze使用Q deferred / promise实现时,Durandal使用JQuery延迟/保证实现。

通过混合两者,你可能会遇到一些问题。

如果您阅读Durandal文档,他们有一个解决方案,使Durandal使用Q而不是JQuery,以便为您的应用程序获得一个consistendt延迟/承诺解决方案。