Javascript 扩展WinJS承诺对象

Javascript 扩展WinJS承诺对象,javascript,windows-8,winjs,promise,Javascript,Windows 8,Winjs,Promise,我想用一种简单的方法把停顿添加到一些我用承诺链接在一起的东西中 我想最好包含一个wait方法,这样我就可以编写如下内容: var promise = new WinJS.Promise(function(complete){ whatever() }).wait(1000).then(function(){ whatever2(); }).wait(500).done(function(){ alldone(); } 为此,我向Promise类添加了一个wait方法,如

我想用一种简单的方法把停顿添加到一些我用承诺链接在一起的东西中

我想最好包含一个wait方法,这样我就可以编写如下内容:

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,将不会有等待函数。我创建的承诺都有等待功能,但是调用一个承诺会导致后续的等待失败,所以

promise.wait(300).then().done();
没有问题,但是:

promise.then().wait(300).done();
将出错,说明从那时返回的承诺没有等待方法


有人能解释一下我做错了什么吗?

这不是对你问题的直接回答。在Promise的原型中添加一个wait方法应该确实有效,除非它返回一个看起来像Promise的对象,看起来像Promise,但实际上不是Promise

也就是说,您首先不必实现wait方法,因为Promise实际上已经公开了一个做同样事情甚至更多事情的方法。您正在寻找它的单参数形式:

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

这不是对你问题的直接回答。在Promise的原型中添加一个wait方法应该确实有效,除非它返回一个看起来像Promise的对象,看起来像Promise,但实际上不是Promise

也就是说,您首先不必实现wait方法,因为Promise实际上已经公开了一个做同样事情甚至更多事情的方法。您正在寻找它的单参数形式:

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

代码不起作用的原因有两个

首先,Microsoft使用了自己的方法来创建对象实例,这是通过WinJS.Class名称空间实现的——这意味着通过添加wait函数而改变的原型永远不会应用于代码中使用的WinJS.Promise对象

第二个问题是,您的目标是错误的对象-WinJS.Promise.then方法调用WinJS.Promise.as,它返回一个CompletePromise对象-因此,即使您可以使等待函数保持不变,它也会位于错误的位置。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);

代码不起作用的原因有两个

首先,Microsoft使用了自己的方法来创建对象实例,这是通过WinJS.Class名称空间实现的——这意味着通过添加wait函数而改变的原型永远不会应用于代码中使用的WinJS.Promise对象

第二个问题是,您的目标是错误的对象-WinJS.Promise.then方法调用WinJS.Promise.as,它返回一个CompletePromise对象-因此,即使您可以使等待函数保持不变,它也会位于错误的位置。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);

谢谢你的回复。我认为您关于返回类型不是真正的承诺的看法是正确的,尽管intellisense文档说它是。我已经看过超时选项,但是你不能在承诺的情况下调用它。您可以调用WinJS.Promise.timeout1000,但不能在这样的链中使用它:var o=new WinJS.Promisefunction{}.timeout1000;这就是我试图用我的等待功能所做的。谢谢你的回复。我认为您关于返回类型不是真正的承诺的看法是正确的,尽管intellisense文档说它是。我已经看过超时选项,但是你不能在承诺的情况下调用它。您可以调用WinJS.Promise.timeout1000,但不能在这样的链中使用它:var o=new WinJS.Promisefunction{}.timeout1000;这就是我试图用我的等待函数所做的。