我正在使用angular resource modul与我的restfull Web服务器一起工作。例如,我有一个返回10个元素的数组的方法,我想做的就是将结果保存到称为books的一些JavaScript变量中(不在 Angular 范围内)。

所以我写了一个简单的方法,看起来像这样:

function getBooks(user_id) {
    var books = [];
    BookFactory.getBooks.query({ id: user_id }).$promise.then(function (result) {
        angular.forEach(result, function(i) {
            books.push(i);
        });
    });
    return books;
}

假设 BookFactory.getBooks.query 可以正常工作,并且确实返回10个元素。
因此,在此函数内部有一个简单的逻辑,我只需将每个元素推到数组中即可。

我也有一个测试功能,用于测试getBooks()函数。这里是:
$scope.testGetBooksMethod = function (user_id) {
    var resut = getBooks(user_id);
    alert(resut.length);
};

警报中的结果将始终为0。我知道这部分代码:
BookFactory.getBooks.query({ id: user_id }).$promise.then(function (result) {
            angular.forEach(result, function(i) {
                books.push(i);
            });
        });

异步工作,直到服务器请求得到处理,函数getBooks()返回一个空书本数组(如果我错了,请纠正我)。

这是一个问题,我该如何编辑我的功能以使其正常工作。我想从休息中获取数据,用此数据填充books数组,然后将其返回。

提前致谢。

最佳答案

您需要在此处使用Promise概念, Controller 功能的testGetBooksMethod将等到服务方法的getBooks完成其调用。为此,您需要从BookFactory.getBooks.query函数返回getBooks promise 。检索数据后,将创建书籍并从getBooks方法返回。在调用getBooks方法时,您需要使用.then函数,该函数将继续执行链 promise ,当从getBooks返回数据时,此函数将获取您的服务返回的数据。

function getBooks(user_id) {
    var books = [];
    return BookFactory.getBooks.query({ id: user_id }).$promise.then(function (result) {
        angular.forEach(result, function(i) {
            books.push(i);
        });
        return books;
    });
}

Controller
$scope.testGetBooksMethod = function (user_id) {
    getBooks(user_id).then(function(resut){
        alert(resut.length);
    });
};

关于javascript - angular js结合了异步和同步代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31228559/

10-09 14:43