Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无法获取属性';然后';使用承诺_Javascript_Xmlhttprequest_Winjs_Promise - Fatal编程技术网

Javascript 无法获取属性';然后';使用承诺

Javascript 无法获取属性';然后';使用承诺,javascript,xmlhttprequest,winjs,promise,Javascript,Xmlhttprequest,Winjs,Promise,我想在我的应用程序中输入最清晰的代码。所以我决定将xhr调用和解析与view.js分开。 为此,我补充说: In View.js this._pagePromises.push(myapp.Services.Foo.getFoo() .then( function success(results) { var x = results; }, function error() { // TODO - handle the error. } )

我想在我的应用程序中输入最清晰的代码。所以我决定将xhr调用和解析与view.js分开。 为此,我补充说:

In 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#developer,我很难理解这种模式

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

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;
}
它解决了我关于“then”的问题,但在“return items”之前调用了“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()返回返回值。然后()。这样做的目的是返回一个承诺,该承诺将通过内部已完成处理程序的返回值来实现:

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获得的承诺使用then/done,完成的处理程序中的结果将是完成的处理程序返回的项。(您不会在此函数中使用.done,因为您希望返回一个承诺。)


这是在Promises-A中指定的允许链接的行为。有关这方面的更多信息,请参阅我在Windows 8开发者博客上的文章。

更简洁的方法是让函数从WinJS.xhr()返回返回值。然后()。这样做的目的是返回一个承诺,该承诺将通过内部已完成处理程序的返回值来实现:

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获得的承诺使用then/done,完成的处理程序中的结果将是完成的处理程序返回的项。(您不会在此函数中使用.done,因为您希望返回一个承诺。)


这是在Promises-A中指定的允许链接的行为。有关这方面的更多信息,请参阅我在Windows8开发者博客上的文章。

True,这样更好。谢谢。没错,那样更好。非常感谢。