Breeze 在Durandal应用程序中与Q承诺抗争
在viewmodel的激活方法中,我有以下代码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 (
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;};