我开始使用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
谁能说出来,我哪里错了?
谢谢:)
答案 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请求完成之前不会执行函数