#author("2019-11-04T15:22:45+09:00","default:ryuichi","ryuichi")
#author("2021-02-28T16:57:15+09:00;2019-11-04T15:22:45+09:00","default:ryuichi","ryuichi")
* 01. Promiseの作成と実行 [#rae716a7]
** Promiseの作成 [#r8244f39]
const p = new Promise((resolve, reject) => { // (0) Promiseオブジェクトの作成
// (1) ここで実行したい処理を実行する(多くの場合、非同期処理の実行をする)
for (let i = 0; i < 100; i++) {
db.query("SELECT * FROM users", (rows) => {
// (2) 処理を終えて、resolveまたはrejectして、メッセージを返す
if (rows) {
resolve({rows:rows, mesg:"処理が成功しました"});
} else {
reject("処理が失敗しました");
}
}
// (2) 処理を終えて、resolveまたはrejectして、メッセージを返す
if (true) {
resolve("処理が成功しました");
} else {
reject("処理が失敗しました");
}
});
- (0)でPromiseオブジェクトを作成しているが、一般的にnewする際に引数に関数を指定して、
- (1)で実行したい処理を実行する(多くの場合は非同期処理の実行になる)
- (2)で処理が成功したならresolve(解決)して、失敗したならrejectする
- 現実的には、例えばsetTimeout()、fs.readFile()、XMLHttpRequestのような非同期関数を実行して、そのコールバックの中でresolveすることになるのが一般的
- ここではresolve()とreject()の引数には文字列のにメッセージを指定しているが、数値でも配列でもオブジェクトでもなんでもよい
- 例えば、fs.readFile()なら読み込んだファイル内のテキスト、XMLHttpRequestならHTTP GETしたHTTPレスポンスオブジェクトなどがresolve()の引数になり、それらのエラーコードがreject()の引数になる
- なお、resolveは必須だが、rejectはなくともよい
** Promiseの実行 [#u511971e]
p.then(message => { // (1)
console.log("resolveされた " + message);
}).catch(errorMessage => { // (2)
console.error("rejectされた " + errorMessage);
});
- (1)でPromise.then()でPromise内の処理を実行して、Promiseの結果としてmessageを受け取る
- (2)で、もしPromiseが解決されなかった場合の結果としてerrorMessageを受け取る
** 参考 [#e0188e46]
: MDN - Promise | https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise