我正在用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/

10-11 01:26
查看更多