なぜ約束を使うのか?
-
解決コールバック地獄
fs.readFile(__dirname + '/data/a.txt', (err, data)=>{ if(!err){ console.log(data.toString()); fs.readFile(__dirname + '/data/b.txt', (err, data)=>{ if(!err){ console.log(data.toString()); } fs.readFile(__dirname + '/data/cc.txt', (err, data)=>{ if(!err){ console.log(data.toString()); } }); }); } });
-
非同期リクエストソリューション
コンセプト
約束とは何ですか?
- 約束、約束。コードでは、我々は理解することができます:私は、私はあなたに結果を与える一定の期間にわたり、約束のコミットメントにここにいます。
- ECMAScriptの6中で反映する一般的な非同期操作をカプセル化するために、コンテナオブジェクトであります
だから、この期間中に何をしますか?
- 私たちは、非同期で動作することができ、
そのようなデータネットワーク、時間のかかる操作を要求するように、ローカルファイルを読み書きなど
三つの状態の約束
非同期操作が成功するか失敗のどちらか、予測できないものである
三つの状態があり、内部の容器を
- 保留中:プロミスオブジェクトのインスタンスが作成されたときの初期状態
- 成就:国家の成功
- 拒否:失敗した状態
注:状態は元に戻すことはできません
ファイルを読むための練習
(作成され、すぐに実行した後)のオブジェクトを作成することを約束
- 特徴点1
、非同期動作は非同期タスク失敗を伝えることを約束、プロミスオブジェクトコンテナ内のオブジェクトの失敗の結果であり、実際には、プロミス内部保留状態が拒否に変更 - 2つの特徴点
プロミス対象非同期動作エラーが発生しない内部には、プロミスの内部にに解決成功し、その後、ペンディング状態を証明しました - 特徴点3(エラー処理)
プロミスを使用例外処理は、最後の後にキャッチを設けることができる周り次いで、非同期プロセス制御を行う
、すべての以前プロミスオブジェクト自体をキャプチャすることができ、障害処理機能を指定し、次いで内部タスクエラー
現在の顔が任意の例外が、後続のすべての約束を含め、直接キャッチに発生し、その後はもはや実行
解決し、2つのパラメータを拒否
結果を返すために障害を解決
成功した結果を返すために拒否
拒否した値、または使用目的に透過率値の複数の配列を渡すだけ決意を:注意。
new Promise((resolve, reject)=>{
resolve(1, 2, 222, 333);
}).then((data1,data2)=>{
console.log(data1,data2);
});
結果:
三つの非同期ファイル読み取り
const fs = require('fs');
new Promise((resolve, reject)=>{
fs.readFile(__dirname + '/data/a.txt', (err, data)=>{
if(err){
reject(err);
}
resolve(data);
});
}).then((data)=>{
console.log(data.toString());
return new Promise((resolve, reject)=>{
fs.readFile(__dirname + '/data/b.txt', (err, data)=>{
if(err){
reject(err);
}
resolve(data);
});
});
}).then((data)=>{
console.log(data.toString());
return new Promise((resolve, reject)=>{
fs.readFile(__dirname + '/data/cc.txt', (err, data)=>{
if(err){
reject(err);
}
resolve(data);
});
});
}).then((data)=>{
console.log(data.toString());
});
3つのファイルが読み取りに最適化非同期
const fs = require('fs');
readFile(__dirname + '/data/b.txt').then((data)=>{
console.log(data.toString());
return readFile(__dirname + '/data/a.txt');
}).then((data)=>{
console.log(data.toString());
return readFile(__dirname + '/data/cc.txt');
}).then((data)=>{
console.log(data.toString());
});
function readFile(...args){
return new Promise((resolve, reject)=>{
fs.readFile(...args, (err, data)=>{
if(err){
reject(err);
}
resolve(data);
})
});
}
例外トラップ
間違った場所があれば最後に、チェーンのキャッチを追加し、キャッチが実行されます
const fs = require('fs');
readFile(__dirname + '/data/b.txt').then((data)=>{
console.log(data.toString());
return readFile(__dirname + '/data/aa.txt');
}).then((data)=>{
console.log(data.toString());
return readFile(__dirname + '/data/cc.txt');
}).then((data)=>{
console.log(data.toString());
}).catch(err => {
console.log(err);
});
function readFile(...args){
return new Promise((resolve, reject)=>{
fs.readFile(...args, (err, data)=>{
if(err){
reject(err);
}
resolve(data);
})
});
}