【问题标题】:Javascript HTTP Request Queue within object variable - initialization doesn't work对象变量中的Javascript HTTP请求队列-初始化不起作用
【发布时间】:2009-11-20 10:23:15
【问题描述】:

我从这个博客获得了以下请求队列实现:

http://dsgdev.wordpress.com/2006/10/28/building-a-javascript-http-request-queue/

并想用对象变量包装它。可惜里面的变量初始化不起作用。

希望有人可以帮助我解决这些问题。提前致谢

var requestQueue = { inCall : false, // 如果我们当前正在通话中,则可以跟踪该变量 callToArray : new Array(), // 呼叫队列 returnToArray : new Array(), // 调用完成时要执行的函数队列 reqMethodArray : new Array(), // 请求方法的队列 创建请求对象:函数(){ var reqObj; var browser = navigator.appName; if(browser == "Microsoft Internet Explorer"){ reqObj = new ActiveXObject("Microsoft.XMLHTTP"); isIE = 真; }别的{ reqObj = 新的 XMLHttpRequest(); } 返回请求对象; }, sendCall:函数(whereTo,returnTo,reqMethod){ // 获取下一个数组项并从数组中删除 this.callToArray.push(whereTo); this.returnToArray.push(returnTo); if (reqMethod != "GET" || reqMethod != "POST") { reqMethod = "GET"; } this.reqMethodArray.push(reqMethod); }, 呼叫队列:函数(){ // 检查队列并在队列中发送下一个呼叫 if(!this.inCall && this.callToArray.length > 0){ // 我们有什么在队列中吗? 如果(this.callToArray.length > 0){ // 我们这样做了,所以在调用数组中获取第一个项目并将其删除 whereTo = this.callToArray.shift(); returnTo = this.returnToArray.shift(); reqMethod = this.reqMethodArray.shift(); // 发送该呼叫 this.doCall(whereTo, returnTo, reqMethod); }别的{ // 更新调试队列 } }别的{ // 更新调试队列 } }, doCall:函数(whereTo,returnTo){ this.inCall = true; var http = this.createRequestObject(); http.open('get', whereTo); // 我们有一个功能可以在通话完成后进行通话吗? 如果(returnTo.length > 0){ eval("http.onreadystatechange = " + returnTo); } // 发送呼叫 http.send(null); } }; setInterval(requestQueue.callQueue, 100);

【问题讨论】:

    标签: javascript object variables queue xmlhttprequest


    【解决方案1】:
    setInterval(requestQueue.callQueue, 100);
    

    requestQueue 中剥离callQueue 方法并将其传递给setInterval。因此callQueue 没有引用requestQueue;当它被回调时,this 将设置为window 而不是requestQueue,因此尝试评估this.callToArray.length 将导致错误。

    this 在 JavaScript 中的工作方式与您对任何其他语言的期望不同。有关说明,请参阅this question。如果您只有一个 requestQueue 实例,您可以只引用它而不是使用 this,否则您需要查看函数绑定或闭包。

    顺便说一句,我不建议使用 UA-string-sniffing 来检测要使用的正确 XHR 对象。尝试特征嗅探:

    var r= window.XMLHttpRequest? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
    

    (如果启用,这也将在 IE7+ 上使用本机 XMLHttp,可能会避免 ActiveX 提示。)

    【讨论】:

      猜你喜欢
      • 2013-04-05
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 2018-05-07
      • 1970-01-01
      • 2017-03-21
      • 2013-05-15
      相关资源
      最近更新 更多