我有一个函数,它将生成WinJS.xhr承诺并将其返回给调用函数。但是在得到承诺之后,当我做了一个。然后,我得到的只是一个空阵列!!!
方法1:
这是返回承诺的函数。它在WinJS.Class.define中:
getFeaturedData: function () {
var featuredUrl = utils.getRequestUrl(globals.featuredTag, 1, 0);
return WinJS.xhr({ url: featuredUrl });
},
我在home.js中调用该函数并以这种方式附加.then:
var promise = MyApp.Services.Movies.getFeaturedData();
promise.then(function(success) {
var data = success;
},
function (error) {
})
结果变量data
总是一个空数组,我似乎无法理解为什么。
方法2:
如果我这样做。然后在getFeaturedData函数本身,那么它的工作原理令人惊讶。
getFeaturedData: function () {
var featuredUrl = utils.getRequestUrl(globals.featuredTag, 1, 0);
var promise = WinJS.xhr({ url: featuredUrl });
promise.then(function (success) {
var data = success;
})
},
在这种情况下,data
似乎包含从服务器返回的正确数据。
任何人都可以解释这种行为吗?为什么第一种方法不起作用而第二种方法不起作用?
答案 0 :(得分:0)
在示例1中,getFeaturedData
正在返回一个承诺
在示例2中,它不返回任何内容(即undefined
)。
但是,设置“数据”的时间不变。在两种情况下,您都在XHR
的完成处理程序中设置“数据”值。最有可能的不同之处在于您设置breakpoint
的位置。在这两种情况下,都不会在getFeaturedData
的末尾或在调用代码块的末尾设置“数据”。相反,它将在XHR
承诺完成后的某个时间设置。
promise.then()
的结果(这是另一个承诺),这样调用者就可以在设置数据后实际安排工作。getFeaturedData().then()
或xhr().then()
的结果。答案 1 :(得分:-2)
我不知道如果它是一个拼写错误,但你的第一个方法是在函数错误结束时缺少一个')'来包含promise结果。
除此之外,我不明白为什么第一种方法不起作用。
话虽如此,我的写作方式如下:
getFeaturedData: function () {
return new WinJS.Promise(function (complete, fail){
var featuredUrl = utils.getRequestUrl(globals.featuredTag, 1, 0);
WinJS.xhr({ url: featuredUrl }).then(
function (data){
complete(data);
}, function (err){
fail(err);
});
});
}
MyApp.Services.Movies.getFeaturedData().then(
function (data){
//do whatever you want with the data
}, function (err){
// handle errors here
});
我更容易看到getFeaturedData
返回一个承诺。在你的情况下,很明显,因为众所周知WinJS.xhr
会返回一个承诺,但并不总是那么容易“立即”看到。