2015-08-28 3 views
0

Я работаю со строкой XMLHttpRequests, каждый из которых зависит от того, что было до нее. Psuedocode:Является ли это хорошим вариантом использования Promises?

xhr1.open('GET', 'http://foo.com'); 
xhr1.onload = function(e){ 
    xhr2.open('POST', xhr1.response.url) 
    xhr2.onload = function(e){ 
    xhr3.open('GET', xhr2.response.url2); 
    xhr3.onload = function(e){ 
     console.log('hooray! you have data from the 3rd URL!'); 
    } 
    xhr3.send(); 
    } 
    xhr2.send(); 
} 
xhr1.send(); 

Это та ситуация, когда использование обещаний было бы хорошей идеей, чтобы избежать всех обратного вызова гадость?

ответ

1

Да, окончательно. Предполагая вспомогательную функцию, как те, из How do I promisify native XHR?, ваш код может быть преобразован в

makeRequest('GET', 'http://foo.com').then(function(response1) { 
    return makeRequest('POST', response1.url); 
}).then(function(response2) { 
    return makeRequest('GET', response2.url2); 
}).then(function(response3) { 
    console.log('hooray! you have data from the 3rd URL!'); 
}); 

Still callbacks of course, но no more nesting required. Кроме того, у вас будет простая обработка ошибок, а код выглядит намного чище (частично это связано с несовместимым фактом абстрагирования XHR в своей собственной функции).

+0

Gotcha, спасибо! Ссылки были большой помощью – NoR

2

Да. Если вы вернете обещание в then, следующий прикованный затем прислушивается к этому обещанию вместо того, чтобы решать первоначальное обещание. Учитывая, что ajaxCall возвращает обещание, ваш код будет выглядеть следующим образом:

ajaxCall(1) 
.then(function(result1){ 
    return ajaxCall(2); 
}) 
.then(function(result2){ 
    return ajaxCall(3); 
}) 
.then(function(result3){ 
    // all done 
}); 

// Sample AJAX call 
function ajaxCall(){ 
    return new Promise(function(resolve, reject){ 
    // xhr code. call resolve/reject with accordingly 
    // args passed into resolve/reject will be passed as result in then 
    }); 
} 
Смежные вопросы