在我的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);
}
};
我希望设置承诺的方式可以检索制造商,然后激活方法就完成了。我希望'从远程数据源检索[制造商]'日志消息发生在'帧视图激活'日志消息之前,但事实上恰恰相反。如何在激活方法完成之前完成数据检索?
答案 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延迟/承诺解决方案。