2015-09-10 6 views
5

मैं एक फार्म सत्यापन के निर्माण कर रहा हूँ और वादों मैं वादा पद्धति का उपयोग कर अतुल्यकालिक सत्यापन कार्यों को लागू करने का फैसला किया जानने के लिए:बीच में बंद करें ajax अनुरोध

var validateAjax = function(value) { 
    return new Promise(function(resolve, reject) { 
     $.ajax('data.json', {data: {value: value}}).success(function(data, status, xhr) { 
      if (data.valid) { 
       resolve(xhr) 
      } 
      else { 
       reject(data.message) 
      } 
     }).error(function(xhr, textStatus) { 
      reject(textStatus) 
     }) 
    }) 
} 

//... 
var validators = [validateAjax]; 
$('body').delegate('.validate', 'keyup', function() { 
    var value = $('#the-input').val(); 
    var results = validators.map(function(validator) { 
     return validator(input) 
    }); 

    var allResolved = Promise.all(results).then(function() { 
     //... 
    }).catch(function() { 
     //... 
    }) 
}); 

यह ठीक काम कर रहा है, इनपुट के रूप में मान्य है उपयोगकर्ता प्रकार (कोड को बहुत लंबा नहीं होने के लिए सरलीकृत किया गया है, उदाहरण के लिए कुंजीपटल गुम होने के बाद टाइमआउट और इसी तरह)।

अब मैं सोच रहा हूं कि AJAX अनुरोध को कैसे मारना है यदि पिछले कीप घटना से सत्यापन अभी भी प्रगति पर है। क्या किसी भी तरह से यह पता लगाना संभव है कि कौन सा राज्य वादा करता है और संभवतः बाहर से वादे को खारिज कर देता है?

उत्तर

8

वादा रद्दीकरण वर्तमान में विनिर्देशन के तहत है, अभी तक ऐसा करने के लिए कोई रास्ता नहीं बनाया गया है (हालांकि यह आ रहा है)। हम इसे अपने आप को लागू कर सकते हैं:

var validateAjax = function(value) { 
    // remove explicit construction: http://stackoverflow.com/questions/23803743 
    var xhr = $.ajax('data.json', {data: {value: value}}); 
    var promise = Promise.resolve(xhr).then(function(data){ 
     if(!data.isValid) throw new Error(data.message); // throw errors 
     return data; 
    }); 
    promise.abort = function(){ 
     xhr.abort(); 
    }); 
    return promise; 
} 

अब, हम को मार सकता है validateAjax वादे पर abort फोन करके कहता है:

var p = validateAjax("..."); // make request 
p.abort(); // abort it; 
+0

महान, मैं समझ गया, आपके उत्तर के लिए धन्यवाद। वैसे भी स्पष्ट निर्माण को हटाने के संबंध में - xhr को अभी भी validateAjax फ़ंक्शन से वापस करने की आवश्यकता है, है ना? –

+0

आपका वैध अजाक्स वापस अपरिभाषित है - क्या कोई लाइन गुम है? –

+0

@ लुकासक्रल - मुझे लगता है कि var 'वादा 'को वापस करने की आवश्यकता होगी, क्योंकि इसमें' .abort' फ़ंक्शन है - लेकिन मैंने कोड नहीं लिखा है, इसलिए मैं केवल –

संबंधित मुद्दे