2015-06-06 20 views
5

मेरे पास जावास्क्रिप्ट में तारों की एक सरणी है। सरणी निम्नलिखित की तरह परिभाषित किया गया है:Async फ़ंक्शन के साथ जावास्क्रिप्ट Arrays

var myArray = []; 
myArray.push('1'); 
myArray.push('2'); 
myArray.push('3'); 

मैं सरणी के माध्यम से लूप करने की जरूरत है और एक समारोह है कि अतुल्यकालिक रूप से चलाता है कहते हैं। यही कारण है कि समारोह इस तरह दिखता है:

function myAsyncFunction(id, callback) { 
    $.ajax({ 
    url: '/api/items', 
    data: { 'id':id }, 
    type: 'POST', 
    dataType: 'text', 
    success: function(result) { 
     if (callback) { 
     callback(); 
     } 
    }, error: function() { 
     if (callback) { 
     callback(); 
     } 
    } 
} 

मैं अपने सरणी में आइटम के सभी के माध्यम से पुनरावृति और यह पता लगाने में कितना समय उन सभी को चलाने के लिए ले जाता है करने के लिए कोशिश कर रहा हूँ।

var startTime = new Date(); 
for (var i=0; i<myArray.length; i++) { 
    myAsyncFunction(myArray[i]); 
} 
var duration = new Date() - startTime; 

जाहिर है, इसके बाद के संस्करण क्योंकि यह सरणी में अगले आइटम पर जाने से पहले खत्म करने के लिए ajax कॉल के लिए इंतजार नहीं कर रहा है काम नहीं करता है: मैं कुछ इस तरह करना चाहते हैं। मुझे पता है मुझे कॉलबैक का उपयोग करने की ज़रूरत है। हालांकि, मुझे यकीन नहीं है कि इस तरह से मेरे कोड को कैसे व्यवस्थित किया जाए। मैं यह कैसे करु? आपको कितने कॉल

var callCount = myArray.length; 

फिर बनाने जा रहे हैं कॉलबैक में, की

+0

काम करता है जवाब में से कोई भी काम या आप समस्याओं का सामना कर रहे हैं, मुझे पता है तो मैं मदद कर सकता है – AmmarCSE

उत्तर

2

उपयोग वादा और कुछ इस तरह करते हैं:

var myArray = [1, 2, 3]; 
var promises = []; 
var startTime = new Date(); 
var duration; 

for (var i = 0, len = myArray.length; i < len; i++) { 
    var def = $.Deferred(); 
    promises.push(def); 

    (function(i) { 
     $.ajax({ 
      url: '/api/items', 
      data: { 'id':myArray[i] }, 
      type: 'POST', 
      dataType: 'text' 
     }).done(function() { 
      promises[i].resolve(); 
     }); 
    })(i); 
} 

$.when.apply($, promises).done(function() { 
    duration = new Date() - startTime; 
    console.log(duration); 
}); 

मैं परीक्षण नहीं किया है, लेकिन मुझे लगता है कि यह कुछ रूपांतरण :)
मुझे लगता है कि के साथ अच्छी तरह से काम कर सकते हैं कि काउंटर के साथ समाधान हो सकता है कुछ शर्तों के तहत विफल।

संपादित करें: यह http://jsfiddle.net/0u21jwxv/

1

रखें ट्रैक की जाँच करता है, तो अपने पिछले एक

success: function(result) { 
     callCount--; 
     if(callCount == 0){ 
      var duration = new Date() - startTime; 
     } 
} 
1

इस उद्देश्य के लिए एक counter का उपयोग करें। एक बार काउंटर वैल्यू 0अवधि ढूंढें।

var startTime = new Date(); 
var counter = myArray.length; //COUNTER 
for (var i=0; i<myArray.length; i++) { 
    myAsyncFunction(myArray[i],function(){//Here you use the callback 
    counter--; 
    if(counter == 0){ 
    var duration = new Date() - startTime; 
    } 
    }); 
} 
संबंधित मुद्दे