无法获取属性'那么'使用承诺
Unable to get property 'then' using promises
我希望在我的应用程序中有最清晰的代码。因此,我决定将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.
相关文章:
- 我的职位回报太快了,如何做出承诺
- 打破承诺链的好方法是什么
- 从函数返回角度承诺
- 我怎样才能获得承诺的价值
- 延期承诺值未更新/解析/延期
- 在承诺链中处理早期回报的最佳方式
- 承诺在非节点式回调上使用Bluebird
- 简单的ES6承诺问题-交换解决和拒绝参数
- 组合承诺和非承诺值
- 带有对象/原型的链式承诺(Q延期)
- JavaScript承诺-无法读取属性'那么'的未定义
- 如何绕过'那么's在承诺链中,就像传统的'return'陈述
- 模拟Angular中的承诺:'那么'不开火
- 那么承诺和AngularJS中的绑定有什么区别
- AngularJS控制器承诺那么不是一个函数
- 返回承诺,但得到'无法读取属性'那么'的未定义'
- 违背承诺”;那么“;带有错误的链回调
- 无法获取属性'那么'使用承诺
- 传递'这'变成'那么'承诺的功能
- 那么承诺就行不通了