Breeze 在Durandal应用程序中与Q承诺抗争

Breeze 在Durandal应用程序中与Q承诺抗争,breeze,durandal,q,Breeze,Durandal,Q,在viewmodel的激活方法中,我有以下代码 function activate() { var promise = Q.all([datacontext.getManufacturers(manufacturers)]); logger.log('Frames View Activated', null, 'frames', false); return promise; } 在我的数据上下文代码中 var getManufacturers = function (

在viewmodel的激活方法中,我有以下代码

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

我希望按照承诺的方式,恢复制造商,然后激活方法完成。我希望“从远程数据源检索[Manufacturer]”日志消息出现在“Frames View Activate”日志消息之前,但事实上情况正好相反。如何在activate方法完成之前完成数据检索?

在这种情况下,您根本不需要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);})

我认为在这种情况下你根本不需要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);})

这里的问题似乎是,当breeze使用Q延迟/承诺实现时,Durandal使用JQuery延迟/承诺实现

把两者混合在一起,你可能会遇到一些问题


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

这里的问题似乎是,breeze使用Q延迟/承诺实现时,Durandal使用JQuery延迟/承诺实现

把两者混合在一起,你可能会遇到一些问题


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

即使我使用var promise=Q.all([datacontext.getManufacturers(manufacturers)]。然后(logger.log('Frames View Activated',null',Frames false)); 回报承诺;要加载的日志消息仍然出现在getManufacturers.Should中的日志消息之前。然后(function(){logger.log('Frames View Activated',null,'Frames',false);});//您应该传递将被调用的函数“then”,而不是调用它。正如Pawel所说,您必须在.then()中添加记录器消息。我编辑了答案以备将来参考。为什么
Q.all([datacontext.getManufacturers(manufacturers)])
?使用
Q.all
等待多个承诺。这里你只有一个。应该是:
datacontext.getManufacturers(manufacturers).then(function(){logger.log('Frames View Activated',null,'Frames',false);})即使我执行var promise=Q.all([datacontext.getManufacturers(manufacturers)])。然后(logger.log('Frames View Activated',null,'Frames',false));回报承诺;要加载的日志消息仍然出现在getManufacturers.Should中的日志消息之前。然后(function(){logger.log('Frames View Activated',null,'Frames',false);});//您应该传递将被调用的函数“then”,而不是调用它。正如Pawel所说,您必须在.then()中添加记录器消息。我编辑了答案以备将来参考。为什么
Q.all([datacontext.getManufacturers(manufacturers)])
?使用
Q.all
等待多个承诺。这里你只有一个。应该是:
datacontext.getManufacturers(manufacturers).then(function(){logger.log('Frames View Activated',null,'Frames',false);})
Jorn,我使用spinet将默认承诺替换为Q承诺,这非常有帮助。system.defer=function(action){var deferred=Q.defer();action.call(deferred,deferred);var promise=deferred.promise;deferred.promise=function(){return promise;};return deferred;};Jorn,我使用spinet将默认承诺替换为Q承诺,这是一个很大的帮助。system.deferred=function(action){var deferred=Q.deferred();action.call(deferred,deferred);var promise=deferred.promise;deferred.promise=function(){return promise;};return deferred;};