我正在用AngularJs编写应用程序,但在兑现承诺方面遇到一些概念上的困难。更具体地说,promise在从api异步提取数据中的作用。
用户加载应用程序时,将发生以下情况:
发送AJAX请求到api。
渲染视图。
接收来自api的响应。
处理数据。
但是,由于AJAX请求(按定义)是异步的,因此应用程序尝试在服务器返回数据之前对数据进行处理,这会导致对象发生未定义的错误等。
在我有这样的服务
app.service('bookService', ['$http', function($http){
var someData;
$http.get('Some URL').success(function (data){
someData = data.someData;
});
var bookService = {};
bookService.getSomeData = function (){
return someData;
};
return bookService;
}]);
还有像这样的控制器
app.controller('BookController', ['bookService', function(bookService){
console.log(bookService.getSomeData().property);
}]);
控制器将在显示附加视图后立即加载,并尝试使用
someData
对象执行某些操作。此时,它仍未定义(http请求尚未返回),并发生错误。相反,我虽然这样的事情可能会工作:
app.service('bookService', ['$http', function($http){
var someDataPromise = $http.get('Some URL');
var bookService = {};
bookService.getSomeData = function (){
someDataPromise.success(function (data){
// This should return the data contained by the promise to the caller
// of the bookService.getSomeData function.
});
};
return bookService;
}]);
控制器将和以前一样。
我对promise和JavaScript的整体体验(尤其是回调和匿名函数之类的概念)的经验非常薄弱。我的怀疑是,尽管从概念上讲,这可能行得通,尽管可能不像我在这里展示的那样。
可以按照我在这里显示的方式使用诺言吗,还是我对这里发生的事情缺乏了解?
最佳答案
您还应考虑更改服务以返回承诺:
app.service('bookService', ['$http', function($http){
var bookService = {};
bookService.getSomeData = function (){
return $http.get('Some URL');
});
return bookService;
}]);
那么您的控制器也可以使用Promise:
app.controller('BookController', ['bookService', '$scope', function(bookService, $scope){
bookService.getSomeData().success(function(data) {
$scope.data = data;
});
}]);
您的服务通常不仅会检索数据,还可以做更多的事情,但是希望这可以证明这个概念。
值得注意的是,一旦在示波器上设置Angular的数据绑定,它将立即拾取数据。
关于javascript - 可以使用promises来确保在请求完成之前不使用来自AJAX请求的数据吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24779651/