2016-10-28 2 views
0

Мне нужно получить содержимое каждого файла в массиве через AJAX, проанализировать их, а затем поместить результаты в массив. Тем не менее, JS пропускает мои вызовы AJAX, казалось бы, ни на что. Я пытаюсь использовать JQuery-х when, чтобы сделать его ждать, но не кажется, что это будет работать:

$.when(
    // Send a request for each file 
    $.map(fileNameArray, function(fileName,i){ 
     $http.get(path + fileName).then(function(file) { 
      // analyze the results (takes some time) 
      var analysis = analyze(file) 
      $log.log("analysis: " + analysis) 
      return analysis 
     }) 
    }) 
).then(function(x){ 
    // I want this to run only after $.map is finished 
    $log.log("x: " + x) 
}) 

Я получаю этот результат:

x: 
analysis: > Object... 

Однако, я ожидал увидеть это:

analysis: Object... 
x: Array [...] 

Могу ли я использовать $ .when неправильно? Есть лучший способ сделать это? Возможно с угловым?

ответ

3

В бесконечной мудрости jQuery $.when() не принимает массив в качестве аргумента, который дает $.map(). Вместо этого $.when() нужны отдельные аргументы.

Для использования аргументов необходимо использовать .apply(). $.when() требует.

$.when.apply($, $.map(...)).then(...) 

Кроме того, вы также должны вернуть $http.get() обещание внутри $.map() обратного вызова. Таким образом, изменение к этому:

$.when.apply($, 
    // Send a request for each file 
    $.map(fileNameArray, function (fileName, i) { 
     return $http.get(path + fileName).then(function (file) { 
      // analyze the results (takes some time) 
      var analysis = analyze(file); 
      $log.log("analysis: " + analysis) 
      return analysis; 
     }); 
    }); 
).then(function(arg1, arg2, arg3) { 
    // results are in separate arguments here 
}); 

Еще лучше было бы, чтобы удалить JQuery обещает от этого целиком и использовать Угловое-х $q.all().

$q.all(fileNameArray.map(function(fileName, i) { 
    return $http.get(path + fileName).then(function(file) { 
     // analyze the results (takes some time) 
     var analysis = analyze(file); 
     $log.log("analysis: " + analysis) 
     return analysis; 
    }); 
})).then(function(results){ 
    // array of results here 
    $log.log(results) 
}) 
+0

угловатые и Jquery обещает совместимы ?, я бы лучше использовать $ q.all –

+0

@ bto.rdz - хороший момент. Я бы рекомендовал удалить из него все jQuery. Если вы добавите такую ​​версию в одно мгновение. – jfriend00

Смежные вопросы