Javascript angular js结合了异步和同步代码
我正在使用angularJavascript 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
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
和pankajparkar2015-07-05 08:45:59Z
。现在决定谁先回答。@user3127896基本上我以13秒的速度打败了他。。我不想强迫你们接受答案,但只是告诉你们时间上的差异正如你们所说,你们后来看到了我的答案
$scope.testGetBooksMethod = function (user_id) {
getBooks(user_id).then(function(books) {
alert(books.length);
});
};