对象变量内的Javascript HTTP请求队列-初始化不';行不通

对象变量内的Javascript HTTP请求队列-初始化不';行不通,javascript,object,variables,queue,xmlhttprequest,Javascript,Object,Variables,Queue,Xmlhttprequest,我从这个博客获得了以下请求队列实现: 并想用一个对象变量来包装它。不幸的是,内部的变量初始化不起作用 希望有人能帮我做这件事。提前谢谢 var requestQueue = { inCall : false, // VARIABLE TO TRACK IF WE ARE CURRENTLY IN A CALL callToArray : new Array(), // QUEUE FOR CALLS return

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

并想用一个对象变量来包装它。不幸的是,内部的变量初始化不起作用

希望有人能帮我做这件事。提前谢谢

var requestQueue = { inCall : false, // VARIABLE TO TRACK IF WE ARE CURRENTLY IN A CALL callToArray : new Array(), // QUEUE FOR CALLS returnToArray : new Array(), // QUEUE FOR FUNCTION TO EXECUTE WHEN CALL COMPLETE reqMethodArray : new Array(), // QUEUE FOR REQUEST METHOD createRequestObject : function(){ var reqObj; var browser = navigator.appName; if(browser == "Microsoft Internet Explorer"){ reqObj = new ActiveXObject("Microsoft.XMLHTTP"); isIE = true; }else{ reqObj = new XMLHttpRequest(); } return reqObj; }, sendCall : function(whereTo, returnTo, reqMethod){ // GET THE NEXT ARRAY ITEM AND REMOVE FROM THE ARRAY this.callToArray.push(whereTo); this.returnToArray.push(returnTo); if (reqMethod != "GET" || reqMethod != "POST") { reqMethod = "GET"; } this.reqMethodArray.push(reqMethod); }, callQueue : function(){ // CHECK THE QUEUE AND SEND THE NEXT CALL IN LINE if(!this.inCall && this.callToArray.length > 0){ // DO WE HAVE ANYTHING IN THE QUEUE? if(this.callToArray.length > 0){ // WE DO, SO GET THE FIRST ITEM IN THE CALL ARRAY AND REMOVE IT whereTo = this.callToArray.shift(); returnTo = this.returnToArray.shift(); reqMethod = this.reqMethodArray.shift(); // SEND THAT CALL this.doCall(whereTo, returnTo, reqMethod); }else{ // UPDATE DEBUG QUEUE } }else{ // UPDATE DEBUG QUEUE } }, doCall : function(whereTo, returnTo){ this.inCall = true; var http = this.createRequestObject(); http.open('get', whereTo); // DO WE HAVE A FUNCTION TO CALL ONCE CALL IS COMPLETED? if(returnTo.length > 0){ eval("http.onreadystatechange = " + returnTo); } // SEND CALL http.send(null); } }; setInterval(requestQueue.callQueue, 100); var requestQueue={ inCall:false,//用于跟踪当前是否在调用中的变量 callToArray:new Array(),//调用队列 returnToArray:new Array(),//调用完成时要执行的函数队列 reqMethodArray:new Array(),//请求方法的队列 createRequestObject:函数(){ var reqObj; var browser=navigator.appName; 如果(浏览器==“Microsoft Internet Explorer”){ reqObj=新的ActiveXObject(“Microsoft.XMLHTTP”); 伊西=真; }否则{ reqObj=newXMLHttpRequest(); } 返回请求; }, sendCall:函数(whereTo、returnTo、reqMethod){ //获取下一个数组项并从数组中删除 这个.callToArray.推(到哪里); this.returnToArray.push(returnTo); 如果(reqMethod!=“GET”| | reqMethod!=“POST”){reqMethod=“GET”} this.reqMethodArray.push(reqMethod); }, 调用队列:函数(){ //检查队列并在队列中发送下一个呼叫 如果(!this.inCall&&this.callToArray.length>0){ //我们有什么东西在排队吗? 如果(this.callToArray.length>0){ //是的,所以获取调用数组中的第一项并将其删除 whereTo=this.callToArray.shift(); returnTo=this.returnToArray.shift(); reqMethod=this.reqMethodArray.shift(); //打那个电话 本文件(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(空); } }; setInterval(requestQueue.callQueue,100); 从
requestQueue
中剥离
callQueue
方法,并将其传递给
setInterval
。因此,
callQueue
没有对
requestQueue
的引用;回调时,
将设置为
窗口
而不是
请求队列
,因此尝试计算
this.callToArray.length将导致错误

这是JavaScript中的
,它的工作方式与任何其他语言都不一样。请参阅以获取解释。如果您只有一个
requestQueue
实例,您可以直接引用它,而不是使用
this
,否则您需要查看函数绑定或闭包

顺便说一句,我不建议使用UA字符串嗅探来检测要使用的正确XHR对象。请尝试功能嗅探:

var r= window.XMLHttpRequest? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
(这也将在IE7+上启用本机XMLHttp,可能避免ActiveX提示。)

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