Я хочу, чтобы в моем приложении был максимально понятный код. Поэтому я решил отделить вызов 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: невозможно получить свойство «тогда» неопределенной или нулевой ссылки
Что я хочу, так это: запустите обещание в view.js, сделайте что-нибудь и обновите представление, когда getFoo() завершится. Я делаю это неправильно, но как разработчику С# мне трудно понять этот шаблон.
Изменить: есть мой обновленный код:
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" });
}
}