1

我向您推荐@kriskowal的优秀文章“反应性一般理论”。在其中,他使用 Q 约定给出了承诺队列的以下实现:

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;
    };
}

您会看到它正在使用 Q 功能,例如deferget。我正试图围绕如何调整它以使用本地承诺,但我正在经历巨大的大脑冻结。(在处理这个问题的过程中,我还发现 Chrome 似乎提供了一种Promise.defer方法,AFAIK 不在规范中。)

有人可以帮忙吗?

4

1 回答 1

2

哦,哇,这很酷,人们实际上正在阅读 gtor :D

在 ES6 Promise 中,替换为 Promise.defer构造函数:

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.

于 2014-11-02T09:11:47.160 回答