2013-09-11 1 views
0

У меня есть Property, который подготавливает запросы AJAX. Однако, как только будет достигнут случай 404, я хотел бы завершить этот поток, но я не уверен, как это сделать. Ниже приведен код:Как вы отменяете свойство Bacon.js, которое делает запрос AJAX, когда достигнут 404?

// load :: EventStream (Int -> Int) 
load = $("#loadimg") 
    .asEventStream("click") 
    .map(function(e){ return function(x){ return x + 1 }}) 

// loadP :: Property Int 
loadP = load.scan(1, function(x,f){ return f(x) }) 

// loadImg :: Property (HttpRequest -> Either String String) 
loadImg = loadP 
    .flatMapLatest(function(i){ return Bacon.fromPromise(imgLoader(i))}) 
    .mapError("") 

// imgLoader :: Int -> HttpRequest String 
imgLoader = function(id){ 

    // pretend src, root and fmt are global variables 
    var url = src + root + id + fmt 

    return $.ajax({ 
     type : "GET", 
     url : url, 
    }) 
    .then(function(ys){ return url }) 

} 

// EventStreamT (State Dom) String 
loadImg.onValue(function(url){ 

    if (url.length == 0) return url   
    else return appendImg("#imgs", "name", url); 

}) 

Это не имеет смысла для меня, чтобы поставить эту «прервать бекона свойство» код в самой последней функции, где находится побочный эффект, но где бы еще я проверить 404 кейс? И как бы я прервал нить?

ответ

2

В Bacon.js 0.6.17, вы можете передать функцию предиката к endOnError, так что вы можете сделать

loadImg = loadP .flatMapLatest (функция (i) {return Bacon.fromPromise (imgLoader (i))}) .endOnError (функция (ошибка) {return error.status == 404})

1

Вы можете просто сказать .endOnError() вместо .mapError(""), чтобы завершить любую ошибку.

Если вам нужна более конкретная обработка каждого типа ошибок, вы можете сделать

loadImg404 = loadImg.mapError(".status").filter(function(status) { return status==404 }) 
... 
loadImg.takeUntil(loadImg404).onValue(..) 

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

  • Нет связанных вопросов^_^