1

我想要一种简单的方法来将暂停添加到我与 Promise 链接在一起的一些内容中。

我认为包含一个“等待”方法会很好,这样我就可以编写如下内容:

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

所以为了做到这一点,我向 Promise 类添加了一个等待方法,如下所示:

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,将没有等待功能。我创建的所有承诺都具有等待功能,但是在承诺上调用 .then() 会导致后续的 .wait 失败,所以......

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

没问题,但是:

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

会出错,说 then() 返回的 Promise 没有等待方法。

谁能解释我做错了什么?

4

2 回答 2

3

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

首先是微软使用他们自己的方法来创建对象实例,他们是通过WinJS.Class命名空间来创建的——这意味着你通过添加wait函数而改变的原型永远不会应用于WinJS.Promise你在你的代码。

第二个问题是你的目标是错误的对象——返回一个对象的WinJS.Promise.then方法调用——所以即使你可以让你的函数坚持下去,它也会在错误的地方。该定义不在公共范围内,因此您必须进行大量修改才能进行所需的更改。WinJS.Promise.asCompletePromisewaitCompletePromise

一个解决方案,但你必须使用该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);
于 2012-09-09T08:32:36.050 回答
2

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

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

var promise = new WinJS.Promise(function(complete) {
    whatever();
}).timeout(1000).then(function() {
    whatever2();
}).timeout(500).done(function() {
    alldone();
});
于 2012-09-09T08:06:46.640 回答