2016-02-26 3 views
0

Я пытаюсь вычислить сумму результатов от внешнего API, и мне нужно сделать один запрос для каждого ключевого слова, которое у меня есть. Код выполняется успешно, но функция возвращает значение до того, как все запросы ajax будут завершены. Я пытался добавить «асинхронный» пары, но это не рекомендуется, то я сделал это:Возвращаемая переменная AJAX после завершения cicle

function calcTotal(arr) { 
var t_docs = 0; 
var i = 0; 
var len = arr.length; 
var aReq = [] 
for(i = 0; i < len; i++) 
{ 
    console.log(i); 
    var apiDataLQKT = { 
     keyword: arr[i], 
     start_date: "2015-01-01", 
     end_date: "2015-06-01", 
     format: 'jsonp', 
     sources_types: sources, 
     sources_names: names, 
     domains: argDomains, 
     words: terms, 
     author_id: usrID, 
     sentiment:sentiment, 
     positive_threshold:posThresh, 
     negative_threshold:negThresh, 
     language:lang, 
     author_location:geolocations, 
     author_gender:genderID, 
     typologies:typID, 
     document_type:docType, 
     source_base_url:'', 
     emotion:'', 
     metadata:'', 
     order_sort:'', 
     order_by:'' 
    } 
    console.log(apiDataLQKT); 
    aReq[i] = $.ajax({ 
     type:'GET', 
     url:apiUrl+'LightQuantitativeKeywordTrend', 
     contentType: 'application/javascript', 
     crossDomain: true, 
     dataType: 'jsonp', 
     data: apiDataLQKT, 
     success: function(json) { 
      var res = json.LightQuantitativeKeywordTrend; 
      t_docs += res.count; 
      console.log("T_DOCS[" + arr[i] + "]: " + t_docs); 
     } 
    }); 
} 
aReq[arr.length-1].done(function(data){ 
    return t_docs; 
}); 
} 

консоль журнал выход:

Total: 0 
T_DOCS[undefined]: 1445 
T_DOCS[undefined]: 1521 
... 

Что еще я могу попробовать?

+0

Вы ищете обещания. См. ['$ .when()'] (https://api.jquery.com/jquery.when/) для примера того, как отложить потребление набора результатов вызова ajax до тех пор, пока не вернутся предыдущие вызовы в очереди. Похоже, это то, о чем вы просите. – War10ck

ответ

0

Вы не можете вернуть значение из асинхронного вызова, например, запрос AJAX, и ожидать, что он будет работать, поскольку код, ожидающий ответа, уже выполнен к моменту получения ответа.

Решение этой проблемы заключается в том, чтобы запустить необходимый код внутри успеха: обратный вызов. В этом случае он получает доступ к данным только тогда, когда они доступны.