Вернуть результаты запроса WinJS.xhr

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

})();

person ahoereth    schedule 10.06.2012    source источник
comment
Нет смысла возвращать результаты от асинхронных обработчиков.   -  person Pointy    schedule 10.06.2012
comment
Если я объявлю var results=[] перед использованием WinJS и верну его после этого, он вообще не изменится, поэтому я попробовал вернуть его ... Как правильно это сделать?   -  person ahoereth    schedule 10.06.2012
comment
Вы должны сделать свой API асинхронным. Пусть функция будет передана вашей функции, а затем вызовет ее из обработчика успеха.   -  person Pointy    schedule 10.06.2012
comment
Вот один из сотен других похожих вопросов StackOverflow на тема.   -  person Pointy    schedule 10.06.2012


Ответы (1)


Вы не сможете заставить свою getData функцию возвращать сами данные - такова природа асинхронных операций в Javascript и Metro.

Функция 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" })
}
person Adam Freeman    schedule 10.06.2012