【问题标题】:Implementing promise queues with native promises?用原生承诺实现承诺队列?
【发布时间】:2014-12-29 01:24:22
【问题描述】:

请参考@kriskowal 的优秀文章“A General Theory of Reactivity”。在其中,他使用 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 不在规范中。)

有人可以帮忙吗?

【问题讨论】:

    标签: promise q es6-promise


    【解决方案1】:

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

    在 ES6 Promise 中,.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 的队列主要用于说明目的和解释概念 - 就我个人而言,我从未真正将它用于任何实际操作。它的用例场景非常微妙,通常如果你想对 promise 进行排队,你只需使用 .then

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-28
      • 2014-03-14
      • 2020-09-20
      • 1970-01-01
      • 2015-03-23
      • 2018-11-03
      • 1970-01-01
      相关资源
      最近更新 更多