骨干javascript setTimeOut方法

时间:2012-05-04 15:36:36

标签: javascript ajax json backbone.js settimeout

我有一个方法setTimeOut的问题,它调用函数self并设置一个延迟,该函数应该在每个请求完成后反复调用,但它只运行一次。它可以在不使用backbone.js的情况下工作,不知道它与backbone.js集成后不起作用。任何帮助表示赞赏!

所以这是客户端中运行GET请求从服务器获取数据的函数,请求在一个时间间隔内运行(在服务器中决定),一旦数据进入,客户端获取它并且请求再次运行后。

    getRequest:function() {
        var XHR = $.ajax({
            url: '/nextdocument',
            type: 'GET',
            async: true,
            cache: false,
            timeout: 11000, 
            success:function(data) {
                var name = data.description;
                var price = data.price;
                console.log("read--> " + name + price);
                setTimeout("this.getRequest", 1000);
                if (data.ok == "true") {
                    data["ok"] = data.ok;
                    $.ajax(
                        {
                            url: "/customerdone",
                            data: JSON.stringify(data),
                            processData: false,
                            type: 'POST',
                            contentType: 'application/json'
                        }
                    )
                }else{
                    //no document if no read in
                    console.log("error--> " + data.errorMessage)
                }
            }
        })
        return XHR;
    }

2 个答案:

答案 0 :(得分:1)

问题是您在setTimeout电话中使用“this”。你不能这样做,因为当计时器执行你想要引用的函数时,“this”将成为全局对象。

像其他人建议的那样,你需要将一个实际的函数传递给你的计时器,而不是一个字符串。那么你可以从你想要的任何对象中引用任何函数。

答案 1 :(得分:0)

可能,函数getRequest没有被调用。据我所知,这是因为您正在向setTimeout函数发送一个字符串 - “this.getRequest”。根据经验,永远不要将字符串传递给它,传递函数。虽然,在某些情况下可能完全没问题(我从不推荐它),这里'这'可能会造成麻烦。使用这样的东西:

getRequest:function() {
    var fn = arguments.callee;
    var XHR = $.ajax({
        url: '/nextdocument',
        type: 'GET',
        async: true,
        cache: false,
        timeout: 11000, 
        success:function(data) {
            var name = data.description;
            var price = data.price;
            console.log("read--> " + name + price);
            setTimeout(fn, 1000);
            if (data.ok == "true") {
                data["ok"] = data.ok;
                $.ajax(
                    {
                        url: "/customerdone",
                        data: JSON.stringify(data),
                        processData: false,
                        type: 'POST',
                        contentType: 'application/json'
                    }
                )
            }else{
                //no document if no read in
                console.log("error--> " + data.errorMessage)
            }
        }
    })
    return XHR;
}