Node-mysql非同期操作を実現(上)
1756 ワード
Node-mysql非同期操作を実現する前に、JSでの非同期操作についてお話しします.ES 6でPromiseオブジェクトが提供されています
Promiseオブジェクトの3つの状態 pending(進行中) fulfilled(成功) rejected(失敗) ステータスの変換または一方向不可逆プロセスpending->fulfilled pending->rejected
きほんしよう
Promise定義後、pending->fulfilledステータスとpending->rejectedステータスに対応するresolveとrejectの2つのパラメータがあります.
実行時、resolveを実行してもrejectを実行しても、返されるのはPromiseオブジェクトで、Promiseオブジェクトの値を取得するにはthenで取得します.thenには、Promiseオブジェクトのresolveパラメータとrejectパラメータに対応する2つの関数があります.
シミュレーション非同期操作の例
よく考えてみると、promiseオブジェクトのデータはthenからデータを得ることができますが、thenのようなチェーン呼び出しはコールバック地獄をもたらす可能性があります.同期関数のように操作してtimeout(100)に直接戻り値を持たせることができれば、もっといいです.ES 2017規格ではasync関数が導入されており、async関数ではpromiseオブジェクトの前にawaitでpromiseオブジェクトから直接データを取得することができます.
上の例を修正する
async関数で印刷された値はthenで印刷された値とそっくりです
Promiseオブジェクトの3つの状態
きほんしよう
Promise定義後、pending->fulfilledステータスとpending->rejectedステータスに対応するresolveとrejectの2つのパラメータがあります.
//
const promise = new Promise(function(resolve, reject) {
//
// ,
if (/* */){
resolve(value);
} else {
reject(error);
}
});
実行時、resolveを実行してもrejectを実行しても、返されるのはPromiseオブジェクトで、Promiseオブジェクトの値を取得するにはthenで取得します.thenには、Promiseオブジェクトのresolveパラメータとrejectパラメータに対応する2つの関数があります.
//
promise.then(function(resolve){
...
},function(reject){
...
})
シミュレーション非同期操作の例
const timeout = (ms) => {
return new Promise((resolve, reject) => {
resolve('done job')
});
}
console.log(timeout(100)) // Promise { 'done job' }
timeout(100).then(res => {
console.log(res) // done job
})
よく考えてみると、promiseオブジェクトのデータはthenからデータを得ることができますが、thenのようなチェーン呼び出しはコールバック地獄をもたらす可能性があります.同期関数のように操作してtimeout(100)に直接戻り値を持たせることができれば、もっといいです.ES 2017規格ではasync関数が導入されており、async関数ではpromiseオブジェクトの前にawaitでpromiseオブジェクトから直接データを取得することができます.
上の例を修正する
async関数で印刷された値はthenで印刷された値とそっくりです
const timeout = (ms) => {
return new Promise((resolve, reject) => {
resolve('done job')
});
}
console.log(timeout(100)) // Promise { 'done job' }
timeout(100).then(res => {
console.log(res) // done job
})
const getStr = async () => {
const str = await timeout(100);
console.log(str) // done job
}
getStr()