javascript - 扩展 WinJS Promise 对象

标签 javascript windows-8 winjs promise

我想要一种简单的方法来将暂停添加到我用 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/

相关文章:

javascript - 带有灰色框的 GridLayout 预渲染 - WinJS

javascript - 正则表达式以字母开头和结尾,允许逗号和破折号

c# - 无法读取 Metro 应用程序中的文本文件?

Javascript .onclick = functionName 传递参数

windows-8 - IntPtr.ToInt32() 和 x64 系统

windows-8 - 如何在 WinRT XAML 中拥有 DesignTime 数据?

javascript - WinJS 数据绑定(bind)到属性获取/设置

windows-8 - WinJS.xhr 本地网络错误

javascript - 没有索引javascript的循环

javascript - 从响应式主题中删除特定的 Javascript 操作