我和$q.defer();有一些问题
当我使用回调时,我的代码正在运行(视图已被更新),但是使用而不是。
这是我的密码:
服务:
eventsApp.factory('eventData', function($http, $q) {
return {
getEvent: function(callback) {
var deferred = $q.defer();
$http({method: 'GET', url: '/node/nodejsserver/server.js'}).
success(function(data, status, headers, config){
//callback(data.event);
deferred.resolve(data.event);
console.log('status: ', status, ' data: ', data);
}).
error(function(data, status, headers, config){
deferred.reject(status);
console.log('status: ', status);
});
return deferred.promise;
}
};
});控制员:
eventsApp.controller('EventController',
function EventController($scope, eventData) {
$scope.event = eventData.getEvent();
}
);但不起作用。
然后我找到了这个答案,我更新了我的控制器如下:
eventsApp.controller('EventController',
function EventController($scope, eventData) {
eventData.getEvent().then(function(result) {
$scope.event = result;
});
}
);而且起作用了。
非工作代码和工作代码的区别是什么?
发布于 2014-08-23 15:24:44
非工作代码使用自动承诺展开,这是不推荐和删除的最新版本的角。它被认为太神奇了。
当您返回承诺时,角用于执行以下操作:
这个行为被角度开发人员认为是令人困惑和神奇的,并被废弃(在1.2中),被禁用,很快(1.3)在角中被移除。通过承诺分配值的正确方法如您在第二个示例中所指出的:
eventData.getEvent().then(function(result) {
$scope.event = result;
});从角度1.3 (待定)释放文档:
$parse:由于fa6e411d,承诺拆开已被删除。自1.2.0-rc.3以来,它一直被废弃。它不能再打开了。已经删除了两种方法:
在1.2版本的文档中:
一般情况下,$parse和模板将不再自动解除承诺。 在此之前:
$scope.foo = $http({method: 'GET', url: '/someUrl'});<p>{{foo}}</p>之后:$http({method: 'GET', url: '/someUrl'}).success(function(data) {$scope.foo = data;});``{foo} ` 这一特性已被废弃。如果绝对需要,现在可以通过$parseProvider.unwrapPromises(true) API重新启用它。
当我们在这里避免使用递延反模式时,$http已经返回了承诺,所以您可以简单地使用return而不是使用$q.defer。
发布于 2014-08-23 15:26:46
编辑:核对本杰明的答案
在您的服务中,您将返回一个promise对象,允诺对象具有.then方法。
您将promise对象分配给$scope.event,因此您将不会获得数据(根据本杰明的说法,在最新版本中)
当您使用deferred.resolve(data.event)解析承诺时,您作为参数传递给.then方法的函数将使用此解析数据调用。
您可以向.then提供第二个参数,在执行deferred.reject()时将调用该参数
这是允诺api的基本功能。只需阅读文档以获得更多信息,https://docs.angularjs.org/api/ng/service/$q
https://stackoverflow.com/questions/25463411
复制相似问题