在渲染视图之前,我在执行具有角度分辨率的微风查询时遇到问题。我正试图在用微风渲染视图之前从服务器获取一些数据。我正在使用
$routeProvider.when('/countries', { templateUrl: 'App/partials/countries.html', controller: Ctrl, resolve: Ctrl.resolve }).
控制器和服务片段:
function Ctrl($scope, Q, datacontext, countries) {
//...
}
function getCountries(forceRefresh) {
var query = entityQuery.
from("countries").
orderBy("name");
return manager.executeQuery(query).
then(getSucceeded);
}
function getSucceeded(data) {
return data.results;
}
这使得我的视图永远不会呈现:
Ctrl.resolve = {
countries: function (datacontext) {
return datacontext.getCountries();
}
}
而如果我创建一个需要更长时间的计时器,它就会工作。我试过用$q包装它,但我似乎无法让它发挥作用。
由于超时,这将呈现视图:
Ctrl.resolve = {
countries: function (datacontext) {
return datacontext.getCountries();
},
delay: function ($q, $timeout) {
var delay = $q.defer();
$timeout(delay.resolve, 6000);
return delay.promise;
}
}
如果有人能帮我,那就太好了。我不确定我是否做错了什么,或者Q承诺或决心是否有局限性。
我感觉到你的痛苦。$q/route解析实现中的一个错误是解析不遵循Q.then
方法。这违反了普遍接受的支持可互换promise实现(叹息)的做法。
但这并不是真正的问题。真正的问题是Angular不知道异步方法何时得到解决。您必须在成功和失败回调中手动调用$rootScope.$apply
。Angular的$http和$q可以为您完成此操作(或等效操作)。自己做好是一个PITA。
正如我所说,我们感受到你的痛苦。很快,我们将发布一个小型Q插件,它可以将Q承诺转换为$Q承诺,并且应该可以减轻这种痛苦。至少对我来说是这样:-)。
简而言之,在你的应用程序启动的地方附近找一个地方,并扩展Q,比如这样:
angular.module('app').factory('util',['$q','$rootScope',util]);函数util($q,$rootScope){extendQ();…此处的其他实用程序。。。//Monkey将$q方法补丁到q.js的promise原型中//示例用法:return manager.executeQuery(qry).to$q(succ,fail);函数extendQ(){var promise=Q.defer().proice;var fn=Object.getPrototypeOf(promise);if(fn至$q)return;//已扩展fn.to$q=函数(成功、失败){返回$q(this,success,fail);};}函数到$q(qPromise,success,fail){var d=$q.dedefe();qPromise.then(函数(数据){if(数据===未定义){logger.log错误("编程错误:没有数据。"+"也许成功回调没有返回值或"+"失败回调未重新抛出错误");//如果错误被捕获并且没有在早期的承诺链中重新抛出//你将带着数据到达这里===未定义。//忽略重新投掷是一种常见的、偶然的疏忽。//为了安全起见,让每次成功回调都返回一些东西//如果数据未定义,请在此处设置陷阱}d.解析(数据);$rootScope$apply();//看见https://groups.google.com/forum/#!主题/角度/LGoBCQ-V_tM}).fail(函数(错误){d.拒绝(错误);$rootScope$apply();//看见https://groups.google.com/forum/#!主题/角度/LGoBCQ-V_tM});if(成功||失败){d.promise=d.promise。然后(成功,失败);}return d.promise;}
现在这样使用它(基于您的示例):
函数getCountrys(){var query=微风。EntityQuery.from("countries").orderBy("name");return manager.executeQuery(query).to$q(getSuccessed);函数getSuccessed(data){return data.results;}}
附录
有人问我:
";
我试过了。。。无法使其发挥作用。具体来说,我尝试了这个:
函数到$q(qPromise,success,fail){var promise=$q.when(qPromise);if(成功||失败){promise=承诺。然后(成功,失败);}回报承诺;}
我认为$q.when
有问题。