【问题标题】:Javascript WinJS.xhr not updating array contentsJavascript WinJS.xhr 不更新数组内容
【发布时间】:2012-10-12 06:05:56
【问题描述】:

我开始使用 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

谁能告诉我,我哪里出错了?

谢谢:)

【问题讨论】:

    标签: javascript windows-8 microsoft-metro winjs


    【解决方案1】:

    问题在于 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 请求完成之前不会执行。

    【讨论】:

      【解决方案2】:

      .then(callback),请求成功时会执行callback函数。

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

      【讨论】:

      • 嘿,我正在尝试通过slickthought.net/post/2012/08/16/… 进行此操作,并按照此操作。所以你建议我在单独的回调函数中编写解析和数组更新步骤??
      • @user1740173 是的,就像你在 ajax 中所做的一样。
      • WinJS.xhr({ url: "http://some-api-with-json-response" }).then(callback); console.log("Second chance:" + sampleArr[0].Name); //REF 2 function callback(response) {//content as prev}; 仍然存在同样的错误:(我做错了吗??
      • 实际上,就代码执行的顺序而言,您的回调函数是与 .then 内联还是单独的函数都无关紧要。关键是console.log("Second chance:"等代码需要inside回调,否则一调用WinJS.xhr就会执行。整个.then 的目的和它的伴侣,.done 是为您提供一个只应在异步调用返回时执行的代码的位置。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-02
      • 1970-01-01
      • 1970-01-01
      • 2018-07-10
      • 2014-03-13
      • 1970-01-01
      相关资源
      最近更新 更多