1

我想定义一个接受承诺并返回相同承诺的函数,除了返回的承诺解决了任意超时;我的代码如下所示;但我不确定我是否抓住了拒绝之类的一切。

//Returns a promise identical to promise, except with an additional delay
// specified by timeout.
delayedPromise(promise, timeout) {
    var newPromise = $.Deferred();
    promise.then(function(result) {
        window.setTimeout(function() {
            newPromise.resolve(result);
        }, 3000);
    }
    return newPromise;
}

有一个更好的方法吗?我是否还需要添加类似的功能来处理错误?

4

2 回答 2

2

我认为你在正确的轨道上,但是你错过了一些细节 - 特别是你delayedPromise不会调用任何具有与原始承诺相同的上下文和参数的后续回调。

试试这个,而不是:

function delayedPromise(promise, timeout) {
    var d = $.Deferred();

    promise.then(function () {
        var ctx = this;
        var args = [].slice.call(arguments, 0);
        setTimeout(function () {
            d.resolveWith(ctx, args);
        }, timeout);
    }, function () {
        var ctx = this;
        var args = [].slice.call(arguments, 0);
        setTimeout(function () {
            d.rejectWith(ctx, args);
        }, timeout);
    });

    return d.promise();
}

其中d.resolveWith()andd.rejectWith调用对于保留上述上下文和参数是必要的。

请注意,progress这种方法不会延迟您的通知,尽管在这种情况下这些通知不一定有意义。

同样,如果您确实希望被拒绝的承诺立即解决(没有延迟),则删除第二个function传递给.then.

于 2013-10-21T15:40:16.207 回答
0

我希望你发现delay在 Q 中的实现很有见地。https://github.com/kriskowal/q/blob/master/q.js#L1629-L1637

Q.delay = function (object, timeout) {
    if (timeout === void 0) {
        timeout = object;
        object = void 0;
    }
    return Q(object).delay(timeout);
};

Promise.prototype.delay = function (timeout) {
    return this.then(function (value) {
        var deferred = defer();
        setTimeout(function () {
            deferred.resolve(value);
        }, timeout);
        return deferred.promise;
    });
};
于 2013-10-22T02:15:50.527 回答