2016-07-25 5 views
0

Ich habe ein globales Array zeigt, außerhalb aller Funktionen definiert wie folgt:globale Variablenwert nicht noch ‚undefined‘ trotz zeigt korrekten Wert in der Funktion

var invoice2016Header = new Array(12); 

ich füllen Sie es dann in meinem loadArray() Funktion:

function loadArray() { 

    var promiseArray = []; 

for (i = 0; i < 12; i++) { 

     promiseArray.push(
      new Promise(function (resolve, reject) { 
       runOWSLS("Invoice", beginning2016Months[i], closing2016Months[i], "no", function (callbackResp) { 
        invoice2016Header[i] = callbackResp.header.ynofreight; 
        alert(invoice2016Header[i]); //This returns the CORRECT value 
        resolve(); 
       }); 
      }) 
     ); 

    } 


    Promise.all(promiseArray).then(function() { 

      for (i = 0; i < 12; i++){ 

       alert(invoice2016Header[i]); //This returns UNDEFINED for every value?? 
      } 


     }); 
} 

Da der invoice2016Header [] Array ist im globalen Bereich ich verstehe nicht, warum, um zu sehen, wenn es um bezeichnet ist, wenn das Versprechen nennt es mich UNDEFINIERT bekommen. Sollte es nicht den Wert haben, der ihm früher zugewiesen wurde?

Der JS Weg Tive tut wirft manchmal mich weg ..

--EDIT--

Hier ist das letzte Bit der Log-Konsole:

monthlyCharting.js:148 OWSLS Ran Successfully 
monthlyCharting.js:149 Object {data: Object, status: 200, config: Object, statusText: "OK"} 
monthlyCharting.js:437 422351.60 
monthlyCharting.js:148 OWSLS Ran Successfully 
monthlyCharting.js:149 Object {data: Object, status: 200, config: Object, statusText: "OK"} 
monthlyCharting.js:437 242180.36 
monthlyCharting.js:452 12 - undefined 
+2

Etwas sagt mir, dass der Code, in dem Sie dieses Problem tatsächlich sehen, anders ist als genau das, was Sie hier gepostet haben. – jfriend00

+1

Ein mögliches Problem ist, dass Sie ein implizit globales 'i' verwenden. Bitte deklarieren Sie diese Variable mit 'var' oder' let' an jeder der beiden Stellen, an denen Sie sie verwenden. – jfriend00

+0

Machst du das in Angular? Es sieht nicht so aus, aber diese Frage ist markiert. – austinthedeveloper

Antwort

0

ich das geändert Weg, in dem das Versprechen zum folgenden Code gerufen wird, und es jetzt funktioniert:

function loadArray() { 


    ... 


var promiseArray = []; 


var get2016Totals = function (i) { 
     return new Promise(function (resolve) { 
      runOWSLS("Invoice", beginning2016Months[i], closing2016Months[i], "no", function (callbackResp) { 
       $scope.invoice2016Header[i] = callbackResp.header.ynofreight; 
       console.log($scope.invoice2016Header[i]); 
       resolve(); 
     }); 
    }) 
} 

for (var i = 0; i < 12; i++) { 

    promiseArray.push(get2016Totals(i)); 

} 


Promise.all(promiseArray).then(function() { 

     for (var month = 0; month < 12; month++){ 

      console.log($scope.invoice2016Header[month]); 
     } 

     google.charts.load('current', {packages: ['corechart', 'bar']}); 
     google.charts.setOnLoadCallback(drawChart); 
    }); 
}