then()からの戻り値とPromise.resolveの違いは何ですか

329
spirytus 2014-12-31 16:08.

違いは何ですか:

new Promise(function(res, rej) {
    res("aaa");
  })
  .then(function(result) {
    return "bbb";
  })
  .then(function(result) {
    console.log(result);
  });

この:

new Promise(function(res, rej) {
    res("aaa");
  })
  .then(function(result) {
    return Promise.resolve("bbb");
  })
  .then(function(result) {
    console.log(result);
  });

Angularと$ httpサービスをチェーン.then()で使用すると、異なる動作が発生するので、質問しています。コードが少し多すぎるため、最初に上記の例を示します。

5 answers

144
Hrishi 2014-12-31 19:31.

ある機能ならばルールは、あるthenハンドラはその値を持つ値、約束の解決さ/拒否を返し、関数が約束を返した場合、何が起こるかで、次のthen句は次のようになりますthenの句返される関数を約束しますしたがって、この場合、最初の例はの通常のシーケンスを通過し、thens予想どおりに値を出力します。2番目の例では、実行すると返されるpromiseオブジェクトPromise.resolve("bbb")は、thenチェーン時に呼び出されるオブジェクトです。(すべての意図と目的のために)。実際に機能する方法については、以下で詳しく説明します。

Promises / A +仕様からの引用:

promise解決手順は、promiseと値を入力として受け取る抽象的な操作[[Resolve]](promise, x)です。これを。と表記します。場合xthenableがあり、それは約束を作るしようとするの状態を採用しx、少なくとも多少の約束のように振る舞うのxは仮定の下で、。それ以外の場合は、値で約束を果たしますx

thenablesのこの処理により、Promises / A +準拠のthenメソッドが公開されている限り、promiseの実装を相互運用できます。また、Promises / A +実装は、合理的なthenメソッドを使用して不適合な実装を「同化」することができます。

ここで注意すべき重要な点は次の行です。

xが約束である場合は、その状態を採用します[3.4]

リンク:https//promisesaplus.com/#point-49

134
Arian Acosta 2017-11-08 12:00.

簡単に言うと、thenハンドラー関数内では次のようになります。

A)x値(数値、文字列など)はいつですか?

  1. return x と同等です return Promise.resolve(x)
  2. throw x と同等です return Promise.reject(x)

B)xプロミスがすでに解決されている(保留されていない)のはいつですか?

  1. return xreturn Promise.resolve(x)Promiseがすでに解決されている場合は、と同等です。
  2. return xreturn Promise.reject(x)Promiseがすでに拒否されている場合は、と同等です。

C)x保留中のPromiseはいつですか。

  1. return x保留中のPromiseを返し、後続ので評価されthenます。

このトピックの詳細については、Promise.prototype.then()ドキュメントをご覧ください

95
JLRishe 2014-12-31 19:21.

どちらの例もほぼ同じように動作するはずです。

then()ハンドラー内で返される値は、そのハンドラーから返されるPromiseの解決値になりthen()ます。内に返される値.then がpromiseの場合、によって返されるpromiseは、そのpromiseのthen()「状態を採用」し、返されたpromiseと同じように解決/拒否します。

最初の例で"bbb"は、最初のthen()ハンドラーに戻るため"bbb"、次のthen()ハンドラーに渡されます。

2番目の例では、値"bbb"ですぐに解決されるpromiseを返すため"bbb"、次のthen()ハンドラーに渡されます。(Promise.resolve()ここは無関係です)。

結果は同じです。

実際に異なる動作を示す例を示すことができれば、なぜそれが起こっているのかを知ることができます。

52
Benjamin Gruenbaum 2014-12-31 21:37.

あなたはすでに良い正式な答えを得ています。短いものを追加する必要があると思いました。

次のことは、Promises / A +の約束と同じです。

  • 呼び出しPromise.resolve(Angularの場合は$q.when
  • promiseコンストラクターを呼び出し、そのリゾルバーで解決します。あなたの場合、それはnew $qです。
  • thenコールバックから値を返します。
  • 値を使用して配列でPromise.allを呼び出し、その値を抽出します。

したがって、以下は、promiseまたはプレーン値Xについてはすべて同じです。

Promise.resolve(x);
new Promise(function(resolve, reject){ resolve(x); });
Promise.resolve().then(function(){ return x; });
Promise.all([x]).then(function(arr){ return arr[0]; });

そして当然のことながら、promiseの仕様は、ライブラリ間の簡単な相互運用($ qやネイティブpromiseなど)を可能にし、全体的な作業を容易にするPromise ResolutionProcedureに基づいています。約束の解決が発生する可能性があるときはいつでも、全体的な一貫性を作成する解決が発生します。

1
vkarpov15 2020-01-23 06:30.

唯一の違いは、そうするときに不必要な約束を作成しているということですreturn Promise.resolve("bbb")onFulfilled()ハンドラーからpromiseを返すと、promiseの解決が始まります。これがPromiseチェーンの仕組みです。

Related questions

MORE COOL STUFF

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは、夫に会ったとき、典型的な交際のアドバイスに逆らいました。

マイケルシーンが非営利の俳優である理由

マイケルシーンが非営利の俳優である理由

マイケルシーンは非営利の俳優ですが、それは正確にはどういう意味ですか?

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。

「たどりつけば」をオンラインでストリーミングできない理由

「たどりつけば」をオンラインでストリーミングできない理由

ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

サロンからのヘアトリミングや個人的な寄付は、油流出を吸収して環境を保護するのに役立つマットとして再利用できます。

ホワイトハウスの最も記憶に残る結婚式を見てください

ホワイトハウスの最も記憶に残る結婚式を見てください

過去200年以上の間にホワイトハウスで結婚したのはほんの数人です。彼らは誰でしたか、そしてそこで結婚式を獲得するために何が必要ですか?

ねえNFL、ジョーバロウとカイラーマレーは女性の権利をサポートするために少しの助けを使うことができます

ねえNFL、ジョーバロウとカイラーマレーは女性の権利をサポートするために少しの助けを使うことができます

ジョー・バロウロー対ウェイド事件の転覆に対応するNFLは、言葉を言わないことで、腹立たしいが予測可能なPRの結果でした。

別の日、別のヒンジのないLIV記者会見

別の日、別のヒンジのないLIV記者会見

(lから)パット・ペレス、ブルックス・ケプカ、パトリック・リードサウジアラビアのLIVゴルフリーグのさらに別の信じられないほどの記者会見で、スポーツのファンはブルックス・ケプカからでたらめな吐き気と質問回避の驚異的なマスタークラスを受けました。パトリックリード、ブライソンデシャンボー、パットペレス、最近のPGAツアーの脱北者。

ミズ・マーベルの家族の帰郷は悪役よりも激しく打撃を与える

ミズ・マーベルの家族の帰郷は悪役よりも激しく打撃を与える

レッドダガーとマーベルさんがチームを組んでいます。

6億7500万ドルのビットコインローンのデフォルト後にすべての資産を清算するように命じられたスリーアローズキャピタル

6億7500万ドルのビットコインローンのデフォルト後にすべての資産を清算するように命じられたスリーアローズキャピタル

暗号業界最大の沈没船の1つであるスリーアローズキャピタルは、ついにその悲惨さから解放されています。火曜日に、不良債権ヘッジファンドは、債権者からの返済を要求する訴訟の高まりに応えて、バージンアイランド裁判所によって清算を命じられました彼らが3ACに行ったローン。

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

シーレン「Ms.JuicyBaby」ピアソンは、先月脳卒中で入院した後、「もう一度たくさんのことをする方法を学ばなければならない」ため、言語療法を受けていることを明らかにしました。

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

オスカー受賞者の世紀半ばの家には、3つのベッドルーム、2つのバス、オーシャンフロントの景色があります。

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、生後4か月の娘、モナコに母乳育児をしていると語った。

Suffragettes Indicam #3: Junho

Suffragettes Indicam #3: Junho

Mais um mês se findando — e metade do ano de 2022 já passou. Sabe o que isso significa? Não, não é hora de verificar se você está cumprindo com suas resoluções de Ano Novo.

Calin (Estudo de Caso UX/UI Design)

Calin (Estudo de Caso UX/UI Design)

Este projeto foi desenvolvido a partir de briefing fictício disponibilizado pelo site Tifólio, uma plataforma para designers. Briefing Matriz CSD Como ponto inicial utilizei como base algumas notícias atuais sobre meios de pagamento digital e com essas informações desenvolvi a Matriz CSD.

多元宇宙—Junø

多元宇宙—Junø

チェーン間アカウントがJunoに登場します。異なるブロックチェーン間でスマートコントラクトの構成可能性と真の相互運用性を提供します。

#brand【ベター・コール・ソール!アメリカのテレビシリーズ「ブレイキング・バッド」に最高のビジネス例が隠されている】・・・ルールクリエイティブ

#brand【ベター・コール・ソール!アメリカのテレビシリーズ「ブレイキング・バッド」に最高のビジネス例が隠されている】・・・ルールクリエイティブ

1.ドラマを見た後、起業する考えはありますか?あなたのビジネスはボトルネックに遭遇しましたか?方向性がなくてわからない場合は、ドラマを追いかけて行くことを心からお勧めします。(?)ブラフではなく、最も完璧なビジネス例を隠すドラマがあります。2.ブレイキング・バッドとその弁護士ドラマ「ブレイキング・バッド」を見た友人たちは、演劇の中で、穏やかな表情で、弁護士のソウル・グッドマンに深く感銘を受けなければなりません。口を開けて、感覚の弱い傭兵の性格を持っています。道徳の面で、サル・グッドマンは無意識のうちに劇に欠かせない役割を果たし、彼自身のシリーズ「絶望的な弁護士」(ベター・コール・ソール)を生み出しました。ウェントウのテキストとビデオは、劇中のソウル・グッドマンのテレビコマーシャルです。製品(サービス)、競争戦略、市場ポジショニング、ブランド名、ターゲット顧客グループ、コミュニケーション軸から広告まで、サル・グッドマンの役割のビジネス設定は、「最低」と見なすことができる超超超超超超完全です。ブランドコミュニケーションのコスト」「変化」のモデル。なぜ?私の分析をご覧ください。3.ソウル・グッドマンの「事業戦略」1.基本情報ブランド名:Saul Goodman製品:法律相談サービス対象顧客:麻薬中毒、飲酒運転、事故など。法律知識の欠如は、一般的に公立弁護士にしか余裕がなく、真面目な弁護士も「特別な法律を持つ消費者」を避けます。恐れてはいけない「​​ニーズ」。コミュニケーションの主軸:この国のすべての男性、女性、子供は有罪判決を受けるまで無実だと思います。地域:アルバカーキ市スローガン:Thrallに電話したほうがいいです!(ベター・コール・ソール)広告:2つの可能性のある犯罪状況をシミュレートします+サウルの主張+サウルのスローガン2をより適切に呼び出します。

Language