我想要一种简单的方法,将停顿添加到一些我用承诺链接在一起的东西中。
我想包含一个"wait“方法会更好,这样我就可以写出这样的东西:
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。我创建的所有promises都具有等待函数,但是对promise调用.then()将导致后续.wait失败,因此...
promise.wait(300).then().done();没有问题,但是:
promise.then().wait(300).done();将错误地指出在从then()返回的Promise上没有等待方法。
谁能解释一下我做错了什么?
发布于 2012-09-09 16:32:36
有两个原因导致你的代码不能工作。
首先,微软使用他们自己的方法来创建对象实例,这是通过WinJS.Class命名空间实现的-这意味着您通过添加wait函数而更改的原型永远不会应用于您在代码中使用的WinJS.Promise对象。
第二个问题是你的目标是错误的对象-- WinJS.Promise.then方法调用了返回CompletePromise对象的WinJS.Promise.as --所以即使你能让你的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);发布于 2012-09-09 16:06:47
这不是对你问题的直接回答。将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();
});https://stackoverflow.com/questions/12336636
复制相似问题