web-dev-qa-db-ja.com

.thenメソッドが呼び出されない場合、Promiseはどのように実行されますか?

2つのPromiseを作成しますが、それらのPromiseに対してthenメソッドを実行しません。ただし、promiseオブジェクトがスコープ外になると、promiseコードは.thenが呼び出されたかのように実行されます。

.thenメソッドを呼び出さずにPromiseを決済するにはどうすればよいですか?

Promiseオブジェクトを含む配列をロードしてから、promiseを順番に実行したいので質問しています。

function promises_createThenRun() {
  const p1 = createPromise1();
  const p2 = createPromise2();

  console.log('before hello');
  alert('hello');
  console.log('after hello');
  // the two promises run at this point.  What makes them run?
}

function createPromise1() {
  let p1 = new Promise((resolve, reject) => {
    window.setTimeout(() => {
      console.log('timer 1');
      resolve();
    }, 2000);
  });
  return p1;
}

function createPromise2() {
  let p2 = new Promise((resolve, reject) => {
    window.setTimeout(() => {
      console.log('timer 2');
      resolve();
    }, 1000);
  });
  return p2;
}
6
Stephen Richter

Promiseコンストラクター内のコードは、Promiseが作成されたときに実行され、同期的に実行されるため、一部の人は驚いています。したがって、then()がなくても、すべてが実行されます。

new Promise(resolve => console.log("running"))

ただし、setTimeoutのコールバックのコードは、呼び出されるまで実行されませんが、then()がなくても実行されます。

new Promise(resolve => {
  console.log("promise created")
  setTimeout(() => console.log("this runs later"), 1000)
})
3
Mark Meyer

.thenを呼び出すときは、約束が完了した後に何が起こるかを示す「コールバック」を設定するだけです。したがって、そのようなコールバックを宣言するかどうかに関係なく、promiseが呼び出されます。

AJAXリクエストを呼び出すpromiseを想像してみてください。.thenを呼び出して関数を渡すと、ajax呼び出しが終了したときに実行されます(タイムアウトやその他のエラーの場合とは異なります)。 )。ただし、.thenを呼び出さなくても、実行中のリクエストは停止しません。リクエストの結果に反応しないだけです。

3
meta

Then/catch/finallyを呼び出さないと「Promiseは実行されない」と思いました。しかし、これらのメソッドが新しいPromiseを返すことを考慮した場合、ロジックに従って、これらの返されたPromiseを「実行」するには、then/catch/finallyを呼び出す必要があります。無限ループに陥ります)) )

0
Veetaha