好的,我是JavaScript编程的新手,我真的很挣扎于异步的东西。我试图在下面展示我的例子:
控制器
$scope.handleClick = function(stuff) {
var promise = fetchOtherStuffs(stuff.id1);
var promiseTwo = fetchOtherStuffs(stuff.id2);
$q.all([promise, promiseTwo]).then(function(data) {
// fails because data is undefined
console.log(data[0].length);
console.log(data[1].length);
});
};
var fetchOtherStuffs = function(stuffId) {
return $http.get('http://localhost/myapi/stuff/' + stuffId)
.then(function(theStuffs) {
var promises = [];
for (var i = 0; i < theStuffs.data.length; i++) {
var otherStuffId = theStuffs.data[i].otherStuffId;
promises.push(
$http.get('http://localhost:8085/myapi/otherstuff/'
+ otherStuffId));
}
$q.all(promises).then(function(data){
var result = [];
for (var i = 0; i < promises.length; i++) {
result.push(data[i].data[i]);
}
// this works and the data count is as expected
console.log('returning: ' + result.length);
return result;
});
});
};
所以我需要:
myapi/stuff
/myapi/otherstuff
我真的不知道如何实现 fetchOtherStuffs 方法,因此,当 handleClick 需要时,返回实际返回一个值方法
非常感谢。
答案 0 :(得分:2)
获取return
后,您在then
回调中忘记了一小部分myapi/stuff
:
function fetchOtherStuffs(stuffId) {
return $http.get('http://localhost/myapi/stuff/' + stuffId)
.then(function(theStuffs) {
…
return $q.all(promises).then(function(data){
// ^^^^^^
…
return result;
});
});
}
另外,我不确定是否在
中两次访问[i]
属性
for (var i = 0; i < promises.length; i++) { result.push(data[i].data[i]); }
是正确的,但这当然取决于数据的格式。