扩展WinJS Promise对象

时间:2012-09-09 05:02:14

标签: javascript windows-8 winjs promise

我想要一种简单的方法来将暂停添加到我与promises链接在一起的东西中。

我认为包含一个“等待”方法会很好,所以我可以编写类似的东西:

var promise = new WinJS.Promise(function(complete){
    whatever()
}).wait(1000).then(function(){
    whatever2();
}).wait(500).done(function(){
    alldone();
}

为此,我向Promise类添加了一个wait方法,如下所示:

if (WinJS.Promise.prototype.wait == null) {
    WinJS.Promise.prototype.wait = function (milliseconds) {
        var promise = new WinJS.Promise(function (complete) {
            setTimeout(complete, milliseconds);
        });
        return promise;
    }
}

它似乎正在工作,但我注意到,如果我使用“then”,我从它返回的对象,虽然文档说是WinJS.Promise,将没有等待函数。我创建的所有DO的promise都有wait函数,但在promise上调用.then()会导致后续的.wait失败,所以......

promise.wait(300).then().done();

没问题但是:

promise.then().wait(300).done();

将错误地说明从then()返回的Promise上没有等待方法。

有谁能解释我做错了什么?

2 个答案:

答案 0 :(得分:3)

您的代码无法正常工作有两个原因。

首先,微软已经使用他们自己的方法来创建对象实例,他们通过WinJS.Class命名空间来实现 - 这意味着你通过添加wait函数来改变原型并不会#39;永远不会应用于您在代码中使用的WinJS.Promise个对象。

第二个问题是您要定位错误的对象 - WinJS.Promise.then方法调用WinJS.Promise.as会返回CompletePromise个对象 - 所以即使您可以创建wait功能棒,它会在错误的地方。 CompletePromise定义不在公共范围内,因此您必须进行大量黑客操作才能进行所需的更改。

解决方案,但您必须使用WinJS.Promise.timeout方法。你不能使用这个内联,这意味着要获得你想要的效果,你需要一些稍微笨拙的代码,如下所示;

var promise = new WinJS.Promise(function (complete) {
    whatever();
    complete();
}).then(function () {
    return WinJS.Promise.timeout(1000);
}).then(whatever2).then(function() {
    return WinJS.Promise.timeout(500);
}).then(alldone);

答案 1 :(得分:2)

这不是您问题的直接答案。将wait()方法添加到Promise的原型确实应该有效,除非then()返回一个看起来像Promise的对象,嘎嘎叫Promise,但是实际上并不是Promise

也就是说,您不必首先实现wait()方法,因为Promise已经公开了一个timeout()方法,它执行相同的操作(实际上更多) 。你正在寻找它的单一论证形式:

var promise = new WinJS.Promise(function(complete) {
    whatever();
}).timeout(1000).then(function() {
    whatever2();
}).timeout(500).done(function() {
    alldone();
});