1

@kriskowal による優れた記事「A General Theory of Reactivity 」を参照してください。その中で、彼は Q 規則を使用して、promise キューの次の実装を提供します。

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

deferやなどの Q 機能を使用していることがわかりますget。これをネイティブの約束を使用するように適応させる方法を先にまとめようとしていますが、大規模な脳のフリーズが発生しています。(これに取り組んでいる過程で、Chrome がPromise.defer仕様にない方法を提供しているように見えるという事実にも遭遇しました。)

誰か助けてくれませんか?

4

1 に答える 1

2

ああ、クールな人々が実際に gtor を読んでいる :D

ES6 のプロミスでは、 の代わり.deferはプロミス コンストラクターです。

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

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

同様に、promise コンストラクターでマップする必要がないため、endsいつでも次のことができます。

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です。

于 2014-11-02T09:11:47.160 に答える