jcm*_*jcm 14 promise angularjs
我有以下控制器代码:
.controller('Controller1', function ($scope, MyService) {
var promise = MyService.getData();
promise.then(function(success) {
console.log("success");
}, function(error) {
console.log("error");
}, function(update) {
console.log("got an update!");
}) ;
Run Code Online (Sandbox Code Playgroud)
}
在我的services.js中:
.factory('MyService', function ($resource, API_END_POINT, localStorageService, $q) {
return {
getData: function() {
var resource = $resource(API_END_POINT + '/data', {
query: { method: 'GET', isArray: true }
});
var deferred = $q.defer();
var response = localStorageService.get("data");
console.log("from local storage: "+JSON.stringify(response));
deferred.notify(response);
resource.query(function (success) {
console.log("success querying RESTful resource")
localStorageService.add("data", success);
deferred.resolve(success);
}, function(error) {
console.log("error occurred");
deferred.reject(response);
});
return deferred.promise;
}
}
})
Run Code Online (Sandbox Code Playgroud)
但由于某种原因,deferred.notify呼叫似乎永远不会执行并在控制器内被接收.我这里有什么不对吗?我不知道如何让通知执行.
小智 21
我设法通过在$ timeout函数中包装notify来使它工作:
$timeout(function() {
deferred.notify('In progress')}
, 0)
Run Code Online (Sandbox Code Playgroud)
看起来你不能在返回promise对象之前调用notify,这有点意义.
我试图在这里重现你的问题。看来,您不能notify直接调用承诺,而必须包装到$apply调用中。
$q 另请参阅此处的文档。
引用示例中的确切行:
由于此 fn 在事件循环的未来回合中执行异步,因此我们需要将代码包装到 $apply 调用中,以便正确观察模型更改。
您可以自己尝试一下并稍微更改一下代码:
deferred.notify(response); // should not work
resource.query(function (success) {
deferred.notify('Returning from resource'); // should work
console.log("success querying RESTful resource")
localStorageService.add("data", success);
deferred.resolve(success);
}, function(error) {
deferred.notify('caught error!'); //should also work
console.log("error occurred");
deferred.reject(response);
});
Run Code Online (Sandbox Code Playgroud)