2016-10-28 4 views
0

Ich muss den Inhalt jeder Datei in einem Array über AJAX erhalten, analysieren sie, dann legen Sie die Ergebnisse in ein Array. Wie auch immer, JS überspringt scheinbar meine AJAX-Anrufe. Ich versuche, jQuery zu verwenden when es warten, aber es scheint nicht zu funktionieren:

$.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) 
}) 

ich dieses Ergebnis:

x: 
analysis: > Object... 

aber ich erwarte, um zu sehen this:

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

Verwende ich $ .when falsch? Gibt es einen besseren Weg, dies zu tun? Möglicherweise mit Angular?

Antwort

3

In jQuery unendliche Weisheit, akzeptiert nicht ein Array als ein Argument, was $.map() bietet. Stattdessen benötigt $.when() separate Argumente.

So können Sie .apply() verwenden, um die Argumente wie $.when()10 erfordert.

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

Darüber hinaus müssen Sie auch aus dem $.map() Rückruf, um die $http.get() Versprechen zurück. Also, um dies zu ändern:

$.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 
}); 

Noch besser wäre es zu entfernen, die jQuery daraus verspricht ganz und verwenden Angular des $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

sind eckig und JQuery verspricht kompatibel ?, ich würde besser $ q.all –

+0

@ bto.rdz verwenden - guter Punkt. Ich würde empfehlen, alle jQuery daraus zu entfernen. Wenn Sie eine solche Version in einem Moment hinzufügen. – jfriend00

Verwandte Themen