我想要一种简单的方法来将暂停添加到我与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上没有等待方法。
有谁能解释我做错了什么?
答案 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();
});