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;
}
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)
})
.then
を呼び出すときは、約束が完了した後に何が起こるかを示す「コールバック」を設定するだけです。したがって、そのようなコールバックを宣言するかどうかに関係なく、promiseが呼び出されます。
AJAXリクエストを呼び出すpromiseを想像してみてください。.then
を呼び出して関数を渡すと、ajax呼び出しが終了したときに実行されます(タイムアウトやその他のエラーの場合とは異なります)。 )。ただし、.then
を呼び出さなくても、実行中のリクエストは停止しません。リクエストの結果に反応しないだけです。
Then/catch/finallyを呼び出さないと「Promiseは実行されない」と思いました。しかし、これらのメソッドが新しいPromiseを返すことを考慮した場合、ロジックに従って、これらの返されたPromiseを「実行」するには、then/catch/finallyを呼び出す必要があります。無限ループに陥ります)) )