【问题标题】:Return WinJS.xhr request results返回 WinJS.xhr 请求结果
【发布时间】:2012-06-10 13:41:37
【问题描述】:

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

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

(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);

})();

【问题讨论】:

  • 从异步处理程序返回结果没有意义。
  • 如果我在使用 WinJS 之前声明 var results=[] 并在之后返回它根本没有改变,所以我尝试了返回的东西.. 正确的方法是什么?
  • 你必须让你的 API 异步。让一个函数传递给你的函数,然后从“成功”处理程序中调用它。
  • Here 是有关该主题的数百个其他类似 StackOverflow 问题之一。

标签: javascript windows winjs microsoft-metro


【解决方案1】:

您将无法让您的 getData 函数返回数据本身 - 这是 Javascript 和 Metro 中异步操作的本质。

WinJS.xhr 函数返回一个WinJS.Promise 对象,它代表一个异步操作。你应该把这个Promise返回给你的调用者,调用者可以使用thendone方法注册回调函数,当操作完成时会收到通知(在Promises的术语中,当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" })
}

【讨论】:

    猜你喜欢
    • 2022-09-24
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 2021-07-08
    • 2012-06-12
    • 2019-12-05
    • 1970-01-01
    相关资源
    最近更新 更多