Javascript 无法获取属性';然后';使用承诺
我想在我的应用程序中输入最清晰的代码。所以我决定将xhr调用和解析与view.js分开。 为此,我补充说: In View.jsJavascript 无法获取属性';然后';使用承诺,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. } )
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,这样更好。谢谢。没错,那样更好。非常感谢。