在函数完成之前返回数组& Angular JS

时间:2015-11-24 05:33:27

标签: javascript arrays angularjs

我正在尝试将所有引入的数组返回数组'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);
        };
    });

1 个答案:

答案 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);
});