Mam problem z moim obietnicą zwrotu kodu, mam funkcję getTagQuotes
, która zawiera pętlę for, która może wywoływać wiele wywołań API w celu zwrócenia danych do tablicy.Jak przywrócić pojedynczą obietnicę po pętli for (która tworzy obietnicę w każdej iteracji) jest zakończona?
Jak mój kod ten zaczyna się poniżej:
// If there are tags, then wait for promise here:
if (tags.length > 0) {
// Setting promise var to getTagQuotes:
var promise = getTagQuotes(tags).then(function() {
console.log('promise =',promise);
// This array should contain 1-3 tags:
console.log('tweetArrayObjsContainer =',tweetArrayObjsContainer);
// Loop through to push array objects into chartObj:
for (var i=0; i<tweetArrayObjsContainer.length; i++) {
chartObj.chartData.push(tweetArrayObjsContainer[i]);
}
// Finally draw the chart:
chartDirective = ScopeFactory.getScope('chart');
chartDirective.nvd3.drawChart(chartObj.chartData);
});
}
Moja getTagQuotes funkcja ze zwrotem Obiecujemy:
function getTagQuotes(tags) {
var deferred = $q.defer(); // setting the defer
var url = 'app/api/social/twitter/volume/';
// My for loop, which only returns ONCE, even if there are 3 tags
for (var i=0; i<tags.length; i++) {
var loopStep = i;
rawTagData = [];
// The return statement
return GetTweetVolFactory.returnTweetVol(url+tags[i].term_id)
.success(function(data, status, headers, config) {
rawTagData.push(data);
// One the last loop, call formatTagData
// which fills the tweetArrayObjsContainer Array
if (loopStep === (rawTagData.length - 1)) {
formatTagData(rawTagData);
deferred.resolve();
return deferred.promise;
}
});
}
function formatTagData(rawData) {
for (var i=0; i<rawData.length; i++) {
var data_array = [];
var loopNum = i;
for (var j=0; j<rawData[loopNum].frequency_counts.length; j++) {
var data_obj = {};
data_obj.x = rawData[loopNum].frequency_counts[j].start_epoch;
data_obj.y = rawData[loopNum].frequency_counts[j].tweets;
data_array.push(data_obj);
}
var tweetArrayObj = {
"key" : "Quantity"+(loopNum+1), "type" : "area", "yAxis" : 1, "values" : data_array
};
tweetArrayObjsContainer.push(tweetArrayObj);
}
}
}
zwracać uwagę tej linii
return GetTweetVolFactory.returnTweetVol(url+tags[i].term_id)
to w moim dla loop:
for (var i=0; i<tags.length; i++)
Wszystko działa wspaniale, jeśli tylko raz wykonam pętlę. Jednak, gdy tylko pojawi się inny znacznik (do 3), nadal zwraca tylko pierwszą pętlę/dane. Nie czeka, aż pętla for zostanie wykonana. Następnie zwróć obietnicę. Mój tweetArrayObjsContainer
zawsze ma tylko pierwszy znacznik.
Opcja 'return' wewnątrz pętli for zwrotów z całego' funkcji getTagQuotes'. 'return' zwróci z bieżącej funkcji, nie ma znaczenia, czy jesteś w pętli lub pętli while lub cokolwiek innego. –
Jestem grany z tym, jeśli usuwam zwrot z 'getTagQuotes', wtedy otrzymuję błąd' .then funkcji undefined' na 'getTagQuotes (tags) .then (function()' –
Oczywiście, ponieważ nie zwróciłeś nic Wygląda na to, że masz 3 przedmioty, z których wszystkie zwracają obietnice i chcesz poczekać na wypełnienie wszystkich obietnic przed podjęciem działania –