2012-06-10 196 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" }) 
}