ここでは仕様に従っていますが、複数の引数を指定してonFulfilledを呼び出すことができるかどうかはわかりません。
いいえ、最初のパラメータだけがpromiseコンストラクタで解決値として扱われます。オブジェクトや配列などの複合値で解決できます。
特定のpromise実装がそれをどのように実行するかは気にしません。promiseのw3c仕様に厳密に従っていきたいと思います。
それはあなたが間違っていると私が信じるところです。仕様は最小限になるように設計されており、promiseライブラリ間の相互運用のために構築されています。たとえば、DOMフューチャーが確実に使用でき、ライブラリが消費できるサブセットを用意することです。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年)当たり前になったスプレッドを使用します。
Promise.resolve(["Hello","World","!"]).then(([a,b,c]) => {
console.log(a,b+c);
});
または待つと:
let [a, b, c] = await Promise.resolve(['hello', 'world', '!']);