Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript angular js结合了异步和同步代码_Javascript_Angularjs_Promise_Angularjs Service_Angular Promise - Fatal编程技术网

Javascript angular js结合了异步和同步代码

Javascript angular js结合了异步和同步代码,javascript,angularjs,promise,angularjs-service,angular-promise,Javascript,Angularjs,Promise,Angularjs Service,Angular Promise,我正在使用angularresourcemodul来处理我的restfull Web服务器。例如,我有一个方法,它返回一个由10个元素组成的数组,我只想将结果保存到一个名为books的javascript变量中(不在角度范围内) 因此,我编写了一个简单的方法,如下所示: function getBooks(user_id) { var books = []; BookFactory.getBooks.query({ id: user_id }).$promise.then(fun

我正在使用angular
resource
modul来处理我的restfull Web服务器。例如,我有一个方法,它返回一个由10个元素组成的数组,我只想将结果保存到一个名为
books
的javascript变量中(不在角度范围内)

因此,我编写了一个简单的方法,如下所示:

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个元素。 因此,在这个函数中有一个简单的逻辑,我只需将每个元素推送到数组books

我还有一个测试函数,用于测试
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()
返回一个空的书籍数组(如果我错了,请纠正我)

这里有一个问题,我如何编辑我的函数,使其正确工作。我想从rest获取数据,用这些数据填充数组
books
,然后返回它


提前感谢。

您需要在这里使用承诺概念,控制器函数的
testGetBooksMethod
将等待服务方法的
getBooks
完成其调用。为此,您需要从
getBooks
函数返回
BookFactory.getBooks.query
promise。获取数据后,将创建书籍,并从
getBooks
方法返回。在调用
getBooks
方法时,您需要使用
。然后
函数,该函数将继续链式承诺,当从
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;
    });
}
控制器

$scope.testGetBooksMethod = function (user_id) {
    getBooks(user_id).then(function(resut){
        alert(resut.length);
    });
};
我想从rest中获取数据,用这些数据填充数组,然后返回

这就是问题所在。异步编程与同步编程并不真正兼容。所以你不能把它们结合起来。但是,您可以以类似同步的方式工作,这就是承诺非常强大的地方。您不返回
数据
,而是返回stateful

因此,与其退回
书籍
不如退回这本书的承诺:

然后,在使用代码时,您将使用此包装器对象和底层状态控制机制,该机制将在书籍加载并可用时继续:

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

所以你知道什么是异步代码,但仍然“我想从rest获取数据,用这些数据填充数组,然后返回”@user3127896哦..谢谢..但为什么我的答案不呢。。?只是想知道。。因此,我可以在这方面进行改进..我第二次看到你的答案=)@user3127896你可以通过悬停在13分钟前回答上来检查时间实际时间戳。。这里是dsfq
2015-07-05 08:46:12Z
和pankajparkar
2015-07-05 08:45:59Z
。现在决定谁先回答。@user3127896基本上我以13秒的速度打败了他。。我不想强迫你们接受答案,但只是告诉你们时间上的差异正如你们所说,你们后来看到了我的答案
$scope.testGetBooksMethod = function (user_id) {
    getBooks(user_id).then(function(books) {
        alert(books.length);
    });
};