使用本机承诺实现承诺队列?

时间:2014-11-02 05:46:08

标签: promise q es6-promise

我想请你阅读@kriskowal的优秀文章“A General Theory of Reactivity”。在其中,他使用Q约定提供了以下Promises队列的实现:

function PromiseQueue() {
    var ends = Promise.defer();
    this.put = function (value) {
        var next = Promise.defer();
        ends.resolve({
            head: value,
            tail: next.promise
        });
        ends.resolve = next.resolve;
    };
    this.get = function () {
        var result = ends.promise.get("head");
        ends.promise = ends.promise.get("tail");
        return result;
    };
}

您会看到它正在使用deferget等Q功能。我正试图将我的前提包括在如何使用本地承诺,但我正在经历大规模的大脑冻结。 (在处理此问题的过程中,我还发现Chrome似乎提供了Promise.defer方法,AFAIK不在规范中。)

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

哦,哇,很酷的人实际上在读gtor:D

在ES6承诺中,.defer的替换是promise构造函数:

this.put = function (value) {
    var r;
    var p = new Promise(function(resolve){ r = resolve; });
    ends.resolve({
        head: value,
        tail: p
    });
    ends.resolve = r;
};

而且.get('foo')只是.then(function(val){ return val['foo']; })的语法糖,因此可以直接翻译:

this.get = function () {
    var result = ends.promise.then(function(v){ return v["head"]; });
    ends.promise = ends.promise.then(function(v){ return v["tail"]; });
    return result;
};

同样,由于你没有ends,你将它与promise构造函数一起映射 - 你总是可以这样做:

var o = {};
var p = new Promise(function(res, rej){ o.res = res; o.rej = rej; });
o.promise = p;
// o is now a deferred 

请注意,Kris的队列主要用于说明目的并解释这个概念 - 我个人从来没有真正将它用于任何实际的事情。它的用例场景非常微妙,通常如果你想对你只使用.then的承诺进行排队。