tra*_*jce 5 javascript promise angularjs
我遇到了一些问题$q.defer();
当我使用回调时,我的代码正在运行(视图已更新),但$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;
}
};
});
Run Code Online (Sandbox Code Playgroud)
控制器:
eventsApp.controller('EventController',
function EventController($scope, eventData) {
$scope.event = eventData.getEvent();
}
);
Run Code Online (Sandbox Code Playgroud)
但它不起作用.
然后我找到了这个答案,我更新了我的控制器,如下所示:
eventsApp.controller('EventController',
function EventController($scope, eventData) {
eventData.getEvent().then(function(result) {
$scope.event = result;
});
}
);
Run Code Online (Sandbox Code Playgroud)
它的工作原理.
非工作代码和工作代码之间有什么区别?
Ben*_*aum 11
非工作代码使用自动承诺展开,在最近的Angular版本中已弃用和删除.它被认为太神奇了.
当您返回承诺时,Angular用于执行以下操作:
Angular开发人员认为这种行为令人困惑和神奇,并且在Angular中被弃用(在1.2中),停用并很快(1.3)被删除.通过promise分配值的正确方法就像您在第二个示例中指出的那样:
eventData.getEvent().then(function(result) {
$scope.event = result;
});
Run Code Online (Sandbox Code Playgroud)
来自Angular 1.3(待定)发布文档:
$ parse:由于fa6e411d,承诺解包已被删除.它自1.2.0-rc.3起已被弃用.它无法再打开.删除了两种方法:
并从1.2发布文档:
$ parse和模板一般不会自动解包promises.
之前:
$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.
| 归档时间: |
|
| 查看次数: |
8225 次 |
| 最近记录: |