2015-09-10 17 views
5

Buduję walidacji formularza i nauczyć obietnice I zdecydowała się na wdrożenie asynchronicznych funkcji sprawdzania poprawności za pomocą obietnica wzór:Abort ajax żądanie w obietnicy

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() { 
     //... 
    }) 
}); 

To wydaje się działać dobrze, wejście jest zatwierdzony jako typy użytkowników (kod jest uproszczony, aby nie był zbyt długi, na przykład czas oczekiwania po braku klucza i tak dalej).

Teraz zastanawiam się, jak zabić żądanie ajax, jeśli walidacja z poprzedniego zdarzenia keyup nadal trwa. Czy można w jakiś sposób wykryć, w którym stanie jest obietnica i ewentualnie odrzucić obietnicę z zewnątrz?

Odpowiedz

8

Rezygnacja z obietnicy jest obecnie w fazie specyfikacji, nie ma jeszcze wbudowanego sposobu, aby to zrobić (jest to jednak możliwe). Możemy go realizować siebie:

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; 
} 

Teraz możemy zabić validateAjax wzywa wywołując abort na obietnicy:

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

wielki, a ja rozumiem, dzięki za odpowiedź. W każdym razie w odniesieniu do usuwania jawnej konstrukcji - xhr nadal musi zostać zwrócony z funkcji validateAjax, prawda? –

+0

Twój validateAjax zwraca undefined - czy brakuje linii? –

+0

@LukasKral - Myślę, że var 'obietnica' musiałaby zostać zwrócona, ponieważ ma funkcję '.abort' - ale nie napisałem kodu, więc mogę tylko spekulować –