无法获取属性'那么'使用承诺

Unable to get property 'then' using promises

本文关键字:承诺 那么 获取 属性      更新时间:2023-09-26

我希望在我的应用程序中有最清晰的代码。因此,我决定将xhr调用和解析从view.js中分离出来。为此,我添加了:

在View.js 中

this._pagePromises.push(myapp.Services.Foo.getFoo()
.then(
    function success(results) {
      var x = results;
    },
    function error() {
      // TODO - handle the error.
    }
));

和在Services.js

Foo:
{   
    getFoo: function () {
        WinJS.xhr({ url: "http://sampleurl.com" }).done(
            function completed(request) {
                //parse request
                var obj = myapp.Parser.parse(request);
                return obj;
            },
            function error(request) {
                // handle error conditions.
            }
        );  
    }
}

但我有一个例外:

0x800a138f-JavaScript运行时错误:无法获取属性"then"未定义或空引用

我想要的是:在view.js中启动promise做一些事情,并在getFoo()完成后更新视图。我这样做的方式不对,但作为一名C#开发人员,我很难理解这种模式。

编辑:这是我更新的代码:

getFoo: function () {
var promise = WinJS.xhr({ url: myapp.WebServices.getfooUrl() });
    promise.done(
        function completed(request) {
            var xmlElements = request.responseXML;
            var parser = new myapp.Parser.foo();
            var items = parser.parse(xmlElements);
            return items;
        },
        function error(request) {
            // handle error conditions.
        }
    );
    return promise;
}

它解决了我关于"然后"的问题,但"退货承诺"是在"退货项目"之前调用的。所以我的"来电者"只得到了承诺,而没有得到结果。

我错过了什么?

编辑2:有正确的方法可以做到这一点:

Foo:
{
    getFooAsync: function () {
        return WinJS.Promise.wrap(this.getXmlFooAsync().then(
            function completed(request) {
                var xmlElements = request.responseXML;
                var parser = new myapp.Parser.Foo();
                var items = parser.parse(xmlElements);
                return items;
            }
        ));  
    },
    getXmlFooAsync: function () {
      return WinJS.xhr({ url: "http://sampleurl.com" });
    }
}

一种更紧凑的方法是让函数返回WinJS.xhr().then()的返回值。这样做的目的是返回一个承诺,该承诺将用内部已完成处理程序的返回值来实现:

Foo:
{
    getFooAsync: function () {
        return WinJS.xhr({ url: "http://sampleurl.com" }).then(
            function completed(request) {
                var xmlElements = request.responseXML;
                var parser = new myapp.Parser.Foo();
                var items = parser.parse(xmlElements);
                return items;
            }
        ));  
    },
}

然后,调用方可以在从getFooAsync获得的promise上使用then/done,并且完成的处理程序中的结果将是完成处理程序返回的。(你不会在这个函数中使用.done,因为你想返回一个承诺。)

这是Promises-A中然后的指定行为,以允许链接。有关这方面的更多信息,请参阅我在Windows8开发者博客上的帖子,http://blogs.msdn.com/b/windowsappdev/archive/2013/06/11/all-about-promises-for-windows-store-apps-written-in-javascript.aspx.