2012-06-10 125 views
1

我正在玩Windows 8 Metro SDK atm,但在使用WinJS.xhr时遇到了一些麻烦。 如果不是在getData函数中返回WinJS.xhr,而是返回一些json对象,一切正常,但我想返回由xhr请求产生的json对象。返回WinJS.xhr请求结果

这里我的尝试有什么问题?谢谢!! :)

(function() { 
    "use strict"; 

function getData() { 
    return WinJS.xhr({ url: "http://stackoverflow.com" }).done(
     function (request) { 
      var results = []; 
      var Item = { 
       title: "title", 
       text: "some text goes here" 
      } 
      results.push(Item); 
      return results; 
     }, 
     function (request) { 
      var results = []; 
      results.push({ title: "error", text: "error text" }); 
      return results; 
     } 
    ); 
} 

var categoryList = new WinJS.Binding.List(getData()); 


var publicMembers = { itemList: categoryList }; 
WinJS.Namespace.define("Data", publicMembers); 

})(); 
+0

它没有意义返回从异步处理结果。 – Pointy

+0

如果我在使用WinJS之前声明'var results = []'并且之后返回,它根本不会被改变,所以我尝试了返回的东西。 什么是正确的方法呢? – ahoereth

+0

你必须让你的API异步。让一个函数被传递给你的函数,然后从“成功”处理程序中调用它。 – Pointy

回答

5

您将无法得到您的getData函数返回数据本身 - 这是在Javascript和地铁异步操作的性质。

WinJS.xhr函数返回一个WinJS.Promise对象,它表示一个异步操作。你应该回到这个Promise到您的来电者,谁可以使用该thendone方法来注册回调函数将被通知当操作完成(在承诺的术语,当Promise满足)。

所以,你的函数的getData主叫会是这个样子:

function myFunc() { 
    getData().then(function(xhr) { 
     // ...do something with the data when it arrives... 
    }, function(err) { 
     // ...do something with the error 
    }); 
} 

注意,回调会被传递XMLHttpRequest对象。

而且你的GetData方法变得像这样:

function getData() { 
    return WinJS.xhr({ url: "http://stackoverflow.com" }) 
}