Javascript WinJS.xhr不更新数组内容

时间:2012-10-12 06:05:57

标签: javascript windows-8 microsoft-metro winjs

我开始使用Javascript开发Win8应用程序。我是javascript的新手因此我对语言不太强。我试图在我的代码中解析一个json响应并将其存储在一个数组中。现在我希望数组是具有特定属性的对象,我试图在解析步骤中设置这些属性。 但是,似乎数组在WinJS.xhr部分内没有得到更新。为了更清楚,REF 1(下面的代码中的注释)控制台输出工作正常,但REF 2(下面的代码中的注释)控制台输出引发错误如下:

  

JavaScript运行时错误:无法获取未定义的属性“名称”   或空引用

var sampleArr = new Array();

WinJS.xhr({ url: "http://some-api-with-json-response" }).then(
       function (response) {
           var name= JSON.parse(response.responseText);
           sampleArr[0] = { Name: name.title };
           console.log("First chance:" + sampleArr[0].Name); //REF 1
           item_number++;
           };

console.log("Second chance:" + sampleArr[0].Name); //REF 2

谁能说出来,我哪里错了?

谢谢:)

2 个答案:

答案 0 :(得分:2)

.then(callback)callback函数将在请求成功时执行。

REF 2的代码在callback函数之前运行,当时sampleArr[0]undefined

答案 1 :(得分:2)

问题是XHR调用是在后台执行的,当发生这种情况时,JavaScript运行时会转到下一个语句 - REF2。因此,您在请求本身完成之前尝试读取请求的结果。

解决方案是将访问结果的代码放在一个函数中,然后传递给then方法的另一个调用,如下所示:

var sampleArr = new Array();

WinJS.xhr({ url: "http://some-api-with-json-response" }).then(
       function (response) {
           var name = JSON.parse(response.responseText);
           sampleArr[0] = { Name: name.title };
           console.log("First chance:" + sampleArr[0].Name); //REF 1
           item_number++;

       }).then(function () {
           console.log("Second chance:" + sampleArr[0].Name); //REF 2
       });

包含REF2的函数在包含REF1的函数完成后才会执行,并且在XHR请求完成之前不会执行函数