2012-06-10 2 views
1

Я играю с Windows 8 Metro SDK atm, но столкнулся с некоторыми проблемами с помощью WinJS.xhr. Если вместо возврата WinJS.xhr в функцию getData я возвращаю некоторый объект json, все работает нормально, но я хочу вернуть объект json, созданный запросом xhr.Вернуться к результатам запроса 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

Если я объявляю 'var results = []' перед использованием WinJS и возвращать его потом, он вообще не изменяется, поэтому я попытался вернуть вещь. Каков правильный способ сделать это? – ahoereth

+0

Вы должны сделать свой API асинхронным. Пусть функция передается вашей функции, а затем вызывает ее из обработчика «success». – Pointy

ответ

5

Вы не сможете получить getData функцию, чтобы вернуть сами данные - это характер асинхронных операций в Javascript и метро.

Функция WinJS.xhr возвращает объект WinJS.Promise, представляющий асинхронную операцию. Вы должны вернуть это Promise к вашему абоненту, который может использовать then или done методы регистрации функций обратного вызова, которые будут получать уведомления о завершении операции (в терминологии Обещаний, когда 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" }) 
} 
Смежные вопросы