如何中止 Bacon.js 属性,该属性在到达 404 后发出 AJAX 请求

How do you abort a Bacon.js Property that is making an AJAX request once 404 is reached?

本文关键字:属性 请求 AJAX Bacon 何中止 js      更新时间:2023-09-26

我有一些Property正在使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情况?我将如何终止线程?

在培根.js 0.6.17 中,你可以将谓词函数传递给endOnError,所以你可以做

负载Img = 负载P .flatMapLatest(function(i){ return Bacon.fromPromise(imgLoader(i) )}) .endOnError(function(error) { return error.status == 404 })

您可以简单地说.endOnError()而不是.mapError("")以任何错误结束。

如果需要对每种错误类型进行更具体的处理,可以

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