1

在 Windows Phone 8 中测试应用程序时,我偶然发现了一个奇怪的问题。我正在使用 xmlHttpRequest(不能使用 ajax,因为我需要作为 bufferarray 发送)来调用第三方 url。这在 Android 和 iOS 中完美运行,但在 WP8 示例中引发错误:

 var xhr = new XMLHttpRequest();
 xhr.onreadystatechange = function (){                      
      if(xhr.readyState == 4){
           if(xhr.status==200){     
               alert(xhr.responseText);
           }else{
                console.log("Error: "+xhr.responseText);
           }
      }
 }
 console.log("1");
 xhr.timeout = 30000;
 console.log("2");
 xhr.open("POST","http://google.com",true);
 console.log("3");
 xhr.setRequestHeader("Content-Type",contentType+"; boundary=" + boundary);
 console.log("4");
 //other headers / auth etc
 console.log("about to post");
 xhr.send(bodyBuf);

这将导致:

 log:"before request"
 log:"1"
 log:"2"
 log:"Error in error callback: Cameraxxxxx = InvalidStateError"

但是,如果我将开放更改为:

 xhr.open("POST","google.com",true); //or www.google.com etc

这会直接发送,但由于找不到 url,所以会得到 404 状态。我显然没有在我的请求中使用谷歌,但错误是一样的。使用“http://”会出错,但如果没有,它不会出错但找不到 url。

任何想法表示赞赏。


我发现了一件事,但不确定它是否相关。根据 W3C html 5 文档,如果文档未完全处于活动状态(当它是其浏览上下文的活动文档时),则会在 open() 上抛出 InvalidStateError。如果这是错误的原因;文档如何不是活动文档以及如何定义不驻留在 url 上的应用程序的基本 url(文档建议将 base 设置为文档的文档基本 url(或设置源源/引荐来源))?


又近了一步。经过大量的摆弄,我最终发现由于某种原因,在 WP8 上需要在应用其他任何东西之前打开 xhr。因此,将 xhr.timeout 移到 xhr.open 以下是可行的。

这在我的特定情况下引发了另一个问题..但这可能是另一个话题。

4

1 回答 1

2

解决方案是将 timout 移到 open 下方.. 所以:

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function (){                      
  if(xhr.readyState == 4){
       if(xhr.status==200){     
           alert(xhr.responseText);
       }else{
            console.log("Error: "+xhr.responseText);
       }
  }
}
xhr.open("POST","http://google.com",true);
xhr.timeout = 30000;
xhr.setRequestHeader("Content-Type",contentType+"; boundary=" + boundary);
//other headers / auth etc

xhr.send(bodyBuf);
于 2013-08-28T22:17:35.170 回答