一部正しくない内容があったので修正して再回答します。
Promise の引数p、thenメソッドの引数t、catchメソッドの引数cはどれも関数オブジェクトで、関数は未実行です。
new Promise(p)でPromiseを作りpending状態にして関数pを呼び出します。
関数pに渡されたresolve(値)を呼び出すとPromiseに値が設定されfulfilled状態になり、関数tを呼ぶ準備ができた状態になります。
関数pに渡されたreject(値)を呼び出すとPromiseに値が設定されreject状態になり、関数cを呼ぶ準備ができた状態になります。
Promise.all や Promise.race はPromiceを作るだけで何も呼び出しません。
スクリプトをすべて実行し終わってJavaScript実行エンジンに制御が戻ると、Promiceの状態に応じて関数tや関数cを呼び出します。
allは、リストのすべてのPromiseが完了状態になるとallの関数tが呼び出されます。
raceは、リストのいずれかのPromiseが完了した時点でraceの関数tが呼び出されるので、allよりも先にraceの結果が表示されることになります。
試しに、ソースコードの最後で require('process').exit(); を実行するようにしてJavaScript実行エンジンNode.jsで実行してみると、JavaScript実行エンジンに制御が戻らずにプログラムが終了するため、Promiseのthenやcatchが呼び出されないことが確認できます。
console.log("start")
function callResolve(resolve, reject) {
console.log('called callResolve');
resolve("resolveなんだ");
}
function callReject(resolve, reject) {
console.log('called callReject');
reject("rejectなんだ");
}
function calledThen(resolve, reject) {
console.log('called calledThen');
}
function calledCatch(resolve, reject) {
console.log('called calledCatch');
}
function printValue(val) {
console.log(val);
}
function doneAll() {
console.log("全Promise終了");
}
function doneRace() {
console.log("あるPromise終了");
}
const promise1 = new Promise(callReject).then(calledThen).catch(printValue);
console.log('promise1');
const promise2 = new Promise(callResolve).then(printValue).catch(calledCatch);
console.log('promise2');
Promise.all([promise1, promise2]).then(doneAll);
console.log('promise3');
Promise.race([promise1, promise2]).then(doneRace);
console.log('promise4');
// require('process').exit();
console.log("end")
実行結果
start
called callReject
promise1
called callResolve
promise2
promise3
promise4
end
resolveなんだ
rejectなんだ
あるPromise終了
全Promise終了
exitした場合
start
called callReject
promise1
called callResolve
promise2
promise3
promise4