首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扩展WinJS Promise对象

扩展WinJS Promise对象
EN

Stack Overflow用户
提问于 2012-09-09 13:02:14
回答 2查看 1.5K关注 0票数 1

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

我想包含一个"wait“方法会更好,这样我就可以写出这样的东西:

代码语言:javascript
复制
var promise = new WinJS.Promise(function(complete){
    whatever()
}).wait(1000).then(function(){
    whatever2();
}).wait(500).done(function(){
    alldone();
}

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

代码语言:javascript
复制
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。我创建的所有promises都具有等待函数,但是对promise调用.then()将导致后续.wait失败,因此...

代码语言:javascript
复制
promise.wait(300).then().done();

没有问题,但是:

代码语言:javascript
复制
promise.then().wait(300).done();

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

谁能解释一下我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-09 16:32:36

有两个原因导致你的代码不能工作。

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

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

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

代码语言:javascript
复制
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);
票数 3
EN

Stack Overflow用户

发布于 2012-09-09 16:06:47

这不是对你问题的直接回答。将wait()方法添加到Promise的原型中应该是可行的,除非then()返回的对象看起来像Promise,叫起来像Promise,但实际上不是Promise

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

代码语言:javascript
复制
var promise = new WinJS.Promise(function(complete) {
    whatever();
}).timeout(1000).then(function() {
    whatever2();
}).timeout(500).done(function() {
    alldone();
});
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12336636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档