我想要一种简单的方法来将暂停添加到我用 promises 链接在一起的一些东西中。
我认为包含一个“等待”方法会很好,这样我就可以编写如下内容:
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。我创建的所有 promise 都具有 wait 函数,但是在 promise 上调用 .then() 会导致后续的 .wait 失败,所以...
promise.wait(300).then().done();
没问题但是:
promise.then().wait(300).done();
会报错说 then() 返回的 Promise 上没有等待方法。
谁能解释我做错了什么?
最佳答案
您的代码不起作用的原因有两个。
首先是 Microsoft 已经使用他们自己的方法来创建对象实例,他们通过 WinJS.Class
命名空间来创建对象实例 - 这意味着您通过添加 来更改原型(prototype)>wait
函数永远不会应用于您在代码中使用的 WinJS.Promise
对象。
第二个问题是您定位了错误的对象 - WinJS.Promise.then
方法调用 WinJS.Promise.as
返回一个 CompletePromise
对象 - 所以即使你可以让你的 wait
功能坚持下去,它也会在错误的地方。 CompletePromise
定义不在公共(public)范围内,因此您必须进行大量修改才能进行所需的更改。
有一个解决方案,但您必须使用 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);
关于javascript - 扩展 WinJS Promise 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12336636/