如何从WinJS函数返回一个承诺?

时间:2014-09-03 06:44:02

标签: javascript windows-8 windows-runtime promise winjs

我有一个函数,它将生成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似乎包含从服务器返回的正确数据。

任何人都可以解释这种行为吗?为什么第一种方法不起作用而第二种方法不起作用?

2 个答案:

答案 0 :(得分:0)

在示例1中,getFeaturedData正在返回一个承诺 在示例2中,它不返回任何内容(即undefined)。

但是,设置“数据”的时间不变。在两种情况下,您都在XHR的完成处理程序中设置“数据”值。最有可能的不同之处在于您设置breakpoint的位置。在这两种情况下,都不会在getFeaturedData的末尾或在调用代码块的末尾设置“数据”。相反,它将在XHR承诺完成后的某个时间设置。

其他一些注意事项:

  1. 方法2可以返回promise.then()的结果(这是另一个承诺),这样调用者就可以在设置数据后实际安排工作。
  2. 在这两种情况下,“promise”变量都是无关紧要的,或者可以设置为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会返回一个承诺,但并不总是那么容易“立即”看到。