2015-02-05 28 views
0

我有一个JS脚本,我正在构建从JSON获取特定ID的ID,显示这些ID,然后从数组中移除找到的ID并移至下一个函数,测试附加值。JS - 强制函数在其他函数之后运行

我的问题是,第二个函数中的代码在第一个函数完成之前正在计算并导致完整的数组出现,而不是在第一个函数完成之后使用已删除的值更新的数组。

在我的控制台日志中可以看到,第126行的第一行(num =)在擦除函数被调用之前进行评估,即使第126行在第二个函数内并且尚未被调用。

num=,111,222,8378102505047 - ScriptNewID.js:126 ["111", "222", "8378102505047"]- ScriptNewID.js:220 ["111", "222"] ScriptNewID.js:221

我怎么能强迫这些价值不是评估,直到第一个函数执行完毕?

在此先感谢!

// Version 1 
 

 
\t getEmptyArticles(); 
 

 
function getEmptyArticles() { 
 
\t 
 
\t articleArray = []; 
 
\t 
 
\t var empytyBaseURL = "scripts/get-empty-rows.php"; 
 

 
\t \t \t $.ajax({ 
 
\t \t \t \t url: empytyBaseURL, 
 
\t \t \t \t dataType: 'json', 
 
\t \t \t \t timeout: 7000 
 
\t \t \t }).done(function(json){ 
 
\t \t \t \t token = json; 
 
\t \t \t \t \t for(var i = 0; i < token.length; i++) { 
 
\t \t \t \t \t articleArray.push(token[i]); 
 
\t \t \t \t \t } 
 
\t \t \t \t API1(articleArray); 
 
\t \t \t \t API2(articleArray); 
 
\t \t \t \t 
 
\t \t \t }).fail(function(){ 
 
\t \t \t \t alert("ERROR: Could Not Get Empty Articles"); 
 
\t \t \t }).always(function() { 
 
\t \t \t \t //setTimeout(getEmptyArticles, 200000); 
 
\t \t \t \t //articleArray.length = 0; 
 
\t \t \t }); \t \t 
 
\t \t \t 
 
} 
 
    
 
function API1(articleIDs) { 
 

 
\t var BaseURL = "OMITTED"; 
 
\t var IDs = returnCIDs(articleIDs, ";"); 
 
\t var APIKey = "OMITTED"; 
 
\t var APIURL = BaseURL + IDs + "?api_key=" + APIKey; 
 
\t \t \t \t 
 
\t \t $.ajax({ 
 
\t \t \t url: APIURL, 
 
\t \t \t dataType: 'json', 
 
\t \t \t timeout: 7000 
 
\t \t }).done(function(json){ 
 
\t \t \t token = json; 
 
\t \t \t obj = token.result; 
 
\t \t \t API1Success(obj); 
 
\t \t }).fail(function(){ 
 
\t \t \t API1Error(); 
 
\t \t }); \t 
 
\t 
 
\t \t function API1Success(obj) { 
 
\t \t \t var lastScan = ""; 
 
\t \t \t 
 
\t \t \t \t for (var i = 0; i < obj.length; i++) { 
 
\t \t \t \t \t if(obj[i].LabelNo) { 
 
\t \t \t \t \t \t //ADD RESULTS TO TABLE HERE 
 
\t \t \t \t \t } else if (obj[i].LabelNumber) { 
 
\t \t \t \t \t \t var arrayIndex = articleArray.indexOf(obj[i].LabelNumber); 
 
\t \t \t \t \t \t \t for (var x = 0; x < obj[i].Scans.length; x++) { 
 
\t \t \t \t \t \t \t \t lastScan = obj[i].Scans[x].StatusDescription; \t 
 
\t \t \t \t \t \t \t } 
 
\t \t \t \t \t \t 
 
\t \t \t \t //POST DATA TO TABLE 1 DATABASE URL 
 
\t \t \t \t \t \t \t \t \t \t \t \t 
 
\t \t \t \t \t \t var id = obj[i].LabelNumber; 
 
\t \t \t \t \t \t lastScan = lastScan.replace(/'/g, ""); 
 
\t \t \t \t \t \t var articles = "None Specified"; 
 
\t \t \t \t \t \t var Name = "OMITTED"; 
 
\t \t \t \t \t \t 
 
\t \t \t \t \t \t postTable1Data(id, lastScan, articles, Name); \t \t \t \t \t 
 
\t \t \t \t 
 
\t \t \t \t //POST DATA TO TABLE 2 DATABASE URL 
 
\t \t \t \t \t 
 
\t \t \t \t \t \t for (var x = 0; x < obj[i].Scans.length; x++) { 
 
\t \t \t \t \t \t \t var eventID = obj[i].LabelNumber; 
 
\t \t \t \t \t \t \t var eventProdType = ""; 
 
\t \t \t \t \t \t \t var eventBadTime = moment(obj[i].Scans[x].Date, "DD/MM/YYYY HH:mm:ss"); 
 
\t \t \t \t \t \t \t var eventGoodTime = eventBadTime.format("YYYY-MM-DD HH:mm:ss"); 
 
\t \t \t \t \t \t \t var eventLocation = obj[i].Scans[x].Name; 
 
\t \t \t \t \t \t \t var scan = obj[i].Scans[x].StatusDescription; 
 
\t \t \t \t \t \t \t scan = scan.replace(/'/g, ""); 
 
\t \t \t \t \t \t \t 
 
\t \t \t \t \t \t \t postTable2Data(eventID, eventProdType, eventGoodTime, eventLocation, scan); 
 
\t \t \t \t \t \t } 
 
\t \t \t \t 
 
\t \t \t \t //REMOVE GOOD URL FROM ARRAY 
 
\t \t \t \t \t eraseFoundArticle(obj[i].LabelNumber); 
 
\t \t \t \t \t } 
 
\t \t \t \t } 
 

 
\t \t } 
 

 
\t \t function API1Error() { 
 
\t \t \t console.log("ERROR CONNECTING TO THE API"); 
 
\t \t } \t 
 
} 
 

 
function API2(articleIDs) { 
 

 
\t 
 
\t var tPHPURL = "omitted"; 
 
\t var tIDs = "num=" + returnCIDs(articleIDs, ","); 
 
\t 
 
\t $.ajax({ 
 
\t \t type: "POST" , 
 
\t \t url: tPHPURL , 
 
\t \t data: tIDs 
 
\t \t }).done(function(json){ 
 
\t \t \t obj = json; 
 
\t \t \t tSuccess(obj); 
 
\t \t }).fail(function(){ 
 
\t \t \t tError(); 
 
\t \t }); \t 
 
\t 
 
\t function tSuccess(obj) { 
 
\t \t \t \t \t \t 
 
\t \t \t \t \t \t \t 
 
\t \t //ERROR LOGGING 
 
\t \t 
 
\t \t if (obj.errors.length > 1) { 
 
\t \t \t for (var i = 0; i < obj.errors.length; i++) { 
 
\t \t \t \t 
 
\t \t \t \t var errors = obj.errors[i]; 
 
\t \t \t \t var strErrors = errors.split(" "); 
 
\t \t \t \t var id = strErrors[1]; 
 
\t \t \t \t var c = "omitted"; 
 
\t \t \t \t 
 
\t \t \t \t postErrorData(id, c) 
 
\t \t \t \t 
 
\t \t \t } 
 
\t \t } 
 
\t \t 
 
\t \t //SUCCESS LOGGING 
 
\t \t 
 
\t \t for (var i = 0; i < obj.tatConnotes.length; i++) { 
 
\t \t \t var id = obj.tatnotes[i].connote; 
 
\t \t \t var status = obj.tatConnotes[i].lastEventStatus; 
 
\t \t \t var articles = obj.tatConnotes[i].actualItems; 
 
\t \t \t var cName = obj.tatConnotes[i].tBusinessName; 
 
\t \t \t 
 
\t \t \t eraseFoundArticle(id); 
 

 
\t \t \t 
 
\t \t \t postTable1Data(id, status, articles, cName); 
 

 
\t \t \t \t for (var x = 0; x < obj.tatnotes[i].cEvents.length; x++) { 
 
\t \t \t \t \t var cId = obj.tatnotes[i].cEvents[x].connote; 
 
\t \t \t \t \t var cType = obj.tatnotes[i].cDescription; 
 
\t \t \t \t \t var badDateTime = moment(obj.tatConnotes[i].cEvents[x].eventDateTime, "ddd D/MM/YYYY hh:mm A"); 
 
\t \t \t \t \t var cDateTime = badDateTime.format("YYYY-MM-DD HH:mm:ss"); 
 
\t \t \t \t \t var cLocation = obj.tatnotes[i].cEvents[x].location; 
 
\t \t \t \t \t var cDescription = obj.tatnotes[i].consignmentEvents[x].eventDescription; 
 
\t \t \t \t \t 
 
\t \t \t \t \t postTable2Data(cId, cType, cDateTime,cLocation ,cDescription); 
 
\t \t \t \t } 
 
\t \t 
 
\t \t } 
 
\t 
 

 
\t } 
 
\t 
 
\t function tError() { 
 
\t \t //ADD BACKUP FUNCTION HERE 
 
\t } 
 

 
} 
 

 
function postTable1Data(id, status, articles, couriername) { 
 
\t \t \t $.ajax({ 
 
\t \t \t \t type: "POST", 
 
\t \t \t \t url: "scripts/update.php", 
 
\t \t \t \t data: //INSERT DATA HERE - OMITTED 
 
\t \t \t \t success: //INSERT DATA HERE - OMITTED 
 
\t \t \t }); \t \t 
 
\t } 
 

 
function postTable2Data(id, type, datetime, location, description) { 
 

 
\t \t \t $.ajax({ 
 
\t \t \t \t type: "POST", 
 
\t \t \t \t url: "scripts/update.php", 
 
\t \t \t \t data: //INSERT DATA HERE - OMITTED 
 
\t \t \t \t success: //INSERT DATA HERE - OMITTED 
 
\t \t \t }); \t 
 

 
\t } 
 
\t 
 
function postErrorData(id, courier) { 
 
\t \t 
 
\t \t //POST ERROR DATA - OMITTED 
 
\t \t 
 
\t } 
 
\t \t 
 
function eraseFoundArticle(id) { 
 
\t \t var arrayIndex = articleArray.indexOf(id); 
 
\t \t \t articleArray.splice(arrayIndex,1); 
 

 
\t } 
 
\t \t 
 

 
function returnCIDs(articleIDs, seperator) { 
 
\t \t \t var cArticleIDs = ""; 
 
\t \t \t for (var i = 0; i < articleIDs.length; i++) { \t 
 
\t \t \t \t var cArticleIDs = cArticleIDs + seperator + articleIDs[i] ; 
 
\t \t \t } 
 
\t \t \t return cArticleIDs; 
 
}

+1

您可以将代码发布到您定义函数的位置吗? – JBaczuk

+0

为您的异步功能使用回调。 – Bergi

+0

检查了这一点:http://stackoverflow.com/questions/25144161/run-function-after-another-one-completes –

回答

1

试试这个(未经测试)。它将不会调用API2,直到API1完成:

// Version 1 

    getEmptyArticles(); 

function getEmptyArticles() { 

    articleArray = []; 

    var empytyBaseURL = "scripts/get-empty-rows.php"; 

      $.ajax({ 
       url: empytyBaseURL, 
       dataType: 'json', 
       timeout: 7000 
      }).done(function(json){ 
       token = json; 
        for(var i = 0; i < token.length; i++) { 
        articleArray.push(token[i]); 
        } 
       API1(articleArray); 

      }).fail(function(){ 
       alert("ERROR: Could Not Get Empty Articles"); 
      }).always(function() { 
       //setTimeout(getEmptyArticles, 200000); 
       //articleArray.length = 0; 
      });  

} 

function API1(articleIDs) { 

    var BaseURL = "OMITTED"; 
    var IDs = returnCIDs(articleIDs, ";"); 
    var APIKey = "OMITTED"; 
    var APIURL = BaseURL + IDs + "?api_key=" + APIKey; 

     $.ajax({ 
      url: APIURL, 
      dataType: 'json', 
      timeout: 7000 
     }).done(function(json){ 
      token = json; 
      obj = token.result; 
      API1Success(obj, articleIDs); 
     }).fail(function(){ 
      API1Error(); 
     }); 

     function API1Success(obj, articleIDs) { 
      var lastScan = ""; 

       for (var i = 0; i < obj.length; i++) { 
        if(obj[i].LabelNo) { 
         //ADD RESULTS TO TABLE HERE 
        } else if (obj[i].LabelNumber) { 
         var arrayIndex = articleArray.indexOf(obj[i].LabelNumber); 
          for (var x = 0; x < obj[i].Scans.length; x++) { 
           lastScan = obj[i].Scans[x].StatusDescription; 
          } 

       //POST DATA TO TABLE 1 DATABASE URL 

         var id = obj[i].LabelNumber; 
         lastScan = lastScan.replace(/'/g, ""); 
         var articles = "None Specified"; 
         var Name = "OMITTED"; 

         postTable1Data(id, lastScan, articles, Name);     

       //POST DATA TO TABLE 2 DATABASE URL 

         for (var x = 0; x < obj[i].Scans.length; x++) { 
          var eventID = obj[i].LabelNumber; 
          var eventProdType = ""; 
          var eventBadTime = moment(obj[i].Scans[x].Date, "DD/MM/YYYY HH:mm:ss"); 
          var eventGoodTime = eventBadTime.format("YYYY-MM-DD HH:mm:ss"); 
          var eventLocation = obj[i].Scans[x].Name; 
          var scan = obj[i].Scans[x].StatusDescription; 
          scan = scan.replace(/'/g, ""); 

          postTable2Data(eventID, eventProdType, eventGoodTime, eventLocation, scan); 
         } 

       //REMOVE GOOD URL FROM ARRAY 
        eraseFoundArticle(obj[i].LabelNumber); 
        } 
       } 
      API2(articleIDs); 

     } 

     function API1Error() { 
      console.log("ERROR CONNECTING TO THE API"); 
     } 

} 

function API2(articleIDs) { 


    var tPHPURL = "omitted"; 
    var tIDs = "num=" + returnCIDs(articleIDs, ","); 

    $.ajax({ 
     type: "POST" , 
     url: tPHPURL , 
     data: tIDs 
     }).done(function(json){ 
      obj = json; 
      tSuccess(obj); 
     }).fail(function(){ 
      tError(); 
     }); 

    function tSuccess(obj) { 


     //ERROR LOGGING 

     if (obj.errors.length > 1) { 
      for (var i = 0; i < obj.errors.length; i++) { 

       var errors = obj.errors[i]; 
       var strErrors = errors.split(" "); 
       var id = strErrors[1]; 
       var c = "omitted"; 

       postErrorData(id, c) 

      } 
     } 

     //SUCCESS LOGGING 

     for (var i = 0; i < obj.tatConnotes.length; i++) { 
      var id = obj.tatnotes[i].connote; 
      var status = obj.tatConnotes[i].lastEventStatus; 
      var articles = obj.tatConnotes[i].actualItems; 
      var cName = obj.tatConnotes[i].tBusinessName; 

      eraseFoundArticle(id); 


      postTable1Data(id, status, articles, cName); 

       for (var x = 0; x < obj.tatnotes[i].cEvents.length; x++) { 
        var cId = obj.tatnotes[i].cEvents[x].connote; 
        var cType = obj.tatnotes[i].cDescription; 
        var badDateTime = moment(obj.tatConnotes[i].cEvents[x].eventDateTime, "ddd D/MM/YYYY hh:mm A"); 
        var cDateTime = badDateTime.format("YYYY-MM-DD HH:mm:ss"); 
        var cLocation = obj.tatnotes[i].cEvents[x].location; 
        var cDescription = obj.tatnotes[i].consignmentEvents[x].eventDescription; 

        postTable2Data(cId, cType, cDateTime,cLocation ,cDescription); 
       } 

     } 


    } 

    function tError() { 
     //ADD BACKUP FUNCTION HERE 
    } 

} 

function postTable1Data(id, status, articles, couriername) { 
      $.ajax({ 
       type: "POST", 
       url: "scripts/update.php", 
       data: //INSERT DATA HERE - OMITTED 
       success: //INSERT DATA HERE - OMITTED 
      });  
    } 

function postTable2Data(id, type, datetime, location, description) { 

      $.ajax({ 
       type: "POST", 
       url: "scripts/update.php", 
       data: //INSERT DATA HERE - OMITTED 
       success: //INSERT DATA HERE - OMITTED 
      }); 

    } 

function postErrorData(id, courier) { 

     //POST ERROR DATA - OMITTED 

    } 

function eraseFoundArticle(id) { 
     var arrayIndex = articleArray.indexOf(id); 
      articleArray.splice(arrayIndex,1); 

    } 


function returnCIDs(articleIDs, seperator) { 
      var cArticleIDs = ""; 
      for (var i = 0; i < articleIDs.length; i++) { 
       var cArticleIDs = cArticleIDs + seperator + articleIDs[i] ; 
      } 
      return cArticleIDs; 
} 
+0

太棒了,我之前尝试过,但使用了错误的参数。现在起作用了。谢谢! –

相关问题