import * as log4js from "log4js";
log4js.configure({
appenders: { console: { type: "stdout"} },
categories: { default: { appenders: ["console"], level: "debug" } }
});
const logger = log4js.getLogger();
/**
* サンプルの Promise.
* @param name JOBの名前
* @param timeout 処理時間
* @param success true(デフォルト) JOBは成功する / false JOBは失敗する
* @returns timeoutミリ秒で終了する
*/
function promiseSomething(name : string, timeout: number, success : boolean = true): Promise<string> {
return new Promise((resolve, reject) => {
logger.debug(`START\t:${name}`);
setTimeout(() => {
if (success) {
resolve(`RESOLVE-${name}`);
} else {
reject(`REJECT-${name}`);
}
},timeout);
});
}
promiseSomething("処理1", 100)
.then((res) => {
// 処理1が終わったあとに呼ばれる.処理1の処理結果 (resolve) は res に格納される
logger.debug(`RES2\t:${res}`);
return promiseSomething("処理2", 100)
})
.then((res) => {
// 処理2が終わったあとに呼ばれる.処理2の処理結果 (resolve) は res に格納される
logger.debug(`RES3\t:${res}`);
return promiseSomething("処理3", 100, false)
})
.then((res) => {
// 処理3は失敗するので、ここは呼ばれない
logger.debug(`RES4\t:${res}`);
return promiseSomething("処理4", 100)
}
// 処理3のエラーをキャッチして復帰処理をして次のJOBを実行したい場合は、then の第二引数にエラーハンドラを書く
// この場合 catch 節には入らない
// ※ 普通は、JOBチェーンのどれかが失敗したら全部失敗とみなすので、 catch 節でまとめてエラー処理をする
// ,
// (err) => {
// logger.debug(`ERROR4\t:${err}`);
// }
)
.catch((err) => {
// 処理3の失敗 (reject) は err に格納される
logger.debug(`ERROR\t:${err}`);
})
.finally(() => {
// ここは、何があっても呼ばれる
logger.debug(`END`);
});
(async () => {
try {
const res5 = await promiseSomething("☆ 処理5", 1000);
logger.debug(`RES\t:${res5}`);
const res6 = await promiseSomething("☆ 処理6", 100);
logger.debug(`RES\t:${res6}`);
const res7 = await promiseSomething("☆ 処理7", 100, false);
logger.debug(`RES\t:${res7}`);
const res8 = await promiseSomething("☆ 処理8", 100);
logger.debug(`RES\t:${res8}`);
logger.debug(`END`);
} catch (err) {
logger.debug(`ERROR\t:${err}`);
}
})();
// Promise.all([]) : すべてのPromiseが成功したら成功とみなす
// Promise.allSettled([]) : すべてのPromiseが終了したら成功とみなす
// Promise.any([]) : どれかのPromiseが成功したら成功とみなす
// Promise.race([]) : 最初のPromiseが成功したら成功とみなす
Promise.all([
promiseSomething("☆ 処理9", 2000),
promiseSomething("☆ 処理10", 2000),
promiseSomething("☆ 処理11", 2000),
promiseSomething("☆ 処理12", 2000),
]).then((res)=>{
logger.debug(res);
})
// 一律 resolve や reject を返す Promise
// 主にテスト用に使うが、プロダクトコードでも使いみちがありそう
// Promise.resolve(res);
// Promise.reject(err);