我正在尝试将所有引入的数组返回数组'self.results',这是在self.yelpResults完成之后。我想在另一个函数中使用返回的数组。现在,self.parsedYelpArray假设接受该数组。
我无法获取self.results返回所有被推入的数组。而是异步地将原始空数组推送到self.parsedYelpArray函数中。
如何解决此问题?
这是我的控制器中的代码:
self.MapRouteArray = CompileMapArray.compileRoutes(data);
self.yelpResults = CompileYelpResults.compileYelp(self.MapRouteArray);
self.parsedYelpArray = ParsingYelpResults.parsingData(self.yelpResults);
而且,这些是相关的服务:
.service('CompileMapArray', function () {
var self = this;
self.MapRouteArray = [];
self.compileRoutes = function (data) {
for (var i = 0; i < data.response.route[0].leg[0].maneuver.length; i += 2) {
self.MapRouteArray.push(data.response.route[0].leg[0].maneuver[i].position.latitude + ',' + data.response.route[0].leg[0].maneuver[i].position.longitude);
}
return self.MapRouteArray;
};
})
.service('CompileYelpResults', function (YelpResource) {
var self = this;
self.results = [];
self.compileYelp = function (mapArray) {
for (var j = 0; j < mapArray.length; j++) {
YelpResource.getListings({term: self.yelpSearch, ll: mapArray[0]}, function (response) {
self.results.push(response.businesses);
console.log(self.results);
});
}
return self.results;
};
})
.service('ParsingYelpResults', function () {
var self = this;
self.parsingData = function (results) {
console.log(results);
};
});
答案 0 :(得分:2)
您正在尝试从异步函数返回;你将永远得到不可靠的结果,你需要传入一个回调函数来处理异步结束时你想要的任何操作......比如:
.service('CompileYelpResults', function (YelpResource) {
var self = this;
self.results = [];
self.compileYelp = function (mapArray, callbackFn) {
for (var j = 0; j < mapArray.length; j++) {
YelpResource.getListings({term: self.yelpSearch, ll: mapArray[0]}, function (response) {
self.results.push(response.businesses);
console.log(self.results);
});
}
callbackFn(self.results);
};
});
然后使用类似的回调函数调用该函数:
var parsed = CompileYelpResults.compileYelp(self.MapRouteArray, function(result) {
console.log(result);
});
这适用于所有异步功能。
关于您的评论,您作为第二个参数传递给compileYelp
的回调函数取代parsingData
,因此您要对results
执行的任何处理都将在正文中回调函数。它提供了额外的优势,因为您可以以您喜欢的方式使用结果。例如。
var logged = CompileYelpResults.compileYelp(self.MapRouteArray, function(result) {
console.log(result);
});
var stringified = CompileYelpResults.compileYelp(self.MapRouteArray, function(result) {
JSON.stringify(result);
});