0

我对调用函数 self 并设置延迟的方法 setTimeOut 有问题,应该在每个请求完成后一次又一次地调用该函数,但它只运行一次。它在不使用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;
    }
4

2 回答 2

1

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

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

于 2012-05-04T17:16:13.283 回答
0

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

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;
}
于 2012-05-04T15:50:10.047 回答