1. ホーム
  2. javascript

[解決済み] プロミスはonFulfilledに複数の引数を持つことができますか?

2022-05-07 12:57:19

質問

仕様書に従っています ここで で、onFulfilledが複数の引数で呼び出されることを許可しているかどうか、よくわかりません。 例えば

promise = new Promise(function(onFulfilled, onRejected){
    onFulfilled('arg1', 'arg2');
})

このような私のコードに

promise.then(function(arg1, arg2){
    // ....
});

の両方を受け取ることになります。 arg1arg2 ?

私は特定のプロミス実装がどのようにそれを行うかについて気にしない、私はプロミスのためのw3c仕様に忠実に従うことを望む。

どのように解決するのですか?

<ブロッククオート

こちらの仕様書に従っているのですが、onFulfilledを複数の引数で呼び出すことができるのかどうか、よくわかりません。

プロミスのコンストラクタで解決値として扱われるのは、最初のパラメータだけです。オブジェクトや配列のような複合的な値で解決することができます。

私は特定のプロミス実装がどのように行うかは気にせず、プロミスのw3c仕様に忠実に従いたいと思っています。

そこが間違っていると思います。その仕様とは 最小限の設計 で、プロミス・ライブラリ間の相互運用のために構築されています。アイデアは,例えば DOM futures が確実に使用でき,ライブラリが消費できるようなサブセットを持つことです.Promise の実装は,あなたが尋ねたことを .spread を使うようになりました。例えば

Promise.try(function(){
    return ["Hello","World","!"];
}).spread(function(a,b,c){
    console.log(a,b+c); // "Hello World!";
});

ブルーバード . この機能が必要な場合の1つの解決策は、ポリフィルを行うことです。

if (!Promise.prototype.spread) {
    Promise.prototype.spread = function (fn) {
        return this.then(function (args) {
            return Promise.all(args); // wait for all
        }).then(function(args){
         //this is always undefined in A+ complaint, but just in case
            return fn.apply(this, args); 
        });
    };
}

これで、できるようになります。

Promise.resolve(null).then(function(){
    return ["Hello","World","!"]; 
}).spread(function(a,b,c){
    console.log(a,b+c);    
});

ネイティブな約束事を安心して フィドル . あるいは、現在(2018年)ブラウザで当たり前のように使われているspreadを使う。

Promise.resolve(["Hello","World","!"]).then(([a,b,c]) => {
  console.log(a,b+c);    
});

あるいはawaitで。

let [a, b, c] = await Promise.resolve(['hello', 'world', '!']);