2016-03-17 2 views
1

Я пытаюсь понять, почему мое использование повторов не работает в этом примере: http://jsbin.com/bobecoluxu/edit?js,outputRxJS повторить оператор с помощью AJAX вызова

var response$ = Rx.Observable.fromPromise(
    $.ajax({ 
    url: 'http://en.wikipedia.org/w/api.php', 
    dataType: 'jsonp', 
    data: { 
     action: 'opensearch', 
     format: 'json', 
     search: term 
    } 
    })) 
.retry(3); 

Я завернутый вызов Ajax в наблюдаемом в функции searchWikipedia , но если я попытаюсь заставить отказ этого вызова отключить Wi-Fi или выбросить исключение связанным оператором, он просто не работает.

Заранее благодарен!

+0

Пожалуйста, введите код ** непосредственно в самом вопросе ** , Ссылки могут меняться и быть устаревшими, аннулируя ваш вопрос. – leDominatre

+0

@scriptHero, извините за неподходящий текст вопроса и благодаря исправлению его для меня. – Brakko

ответ

1

Когда вы передаете обещание fromPromise и повторите попытку вызова, он просто будет продолжать излучать то же обещание (т. Е. Последующие HTTP-запросы не будут сделаны).

Если вы передадите функцию, которая возвращает Promise на fromPromise, эта функция будет повторно вызвана (что позволяет отправлять последующие HTTP-запросы при сбое). Следующий пример иллюстрирует это:

const makesPromise =() => { 
    console.log('calling'); 

    // Purposefully reject the Promise. You would return the return value 
    // of your call to $.ajax() 
    return Promise.reject(); 
}; 

const stream = Rx.Observable.fromPromise(makesPromise).retry(3); 

stream.subscribe(log); 

// >> calling 
// >> calling 
// >> calling 
// Finally throws an uncaught error 

Примечание: я должен был обновить до последней версии 4.х RXJS, чтобы использовать эту функцию

+2

Другим способом выражения этого является то, что вы не дали RxJS способ создания обещания/выдачи запроса, поэтому он не знает, как это сделать, когда он идет на повторную попытку. Вместо этого вы сделали запрос на него и дали ему результат (обещание). Это как разница между дачей человека рыбе и обучением его рыбной ловле. Если вы даете кому-то рыбу, и она оказывается выключенной, но вы нигде не видите, лучшее, что они могут сделать, это надеяться на то, что вы вернетесь с новой свежей рыбой. – GregL

Смежные вопросы