説明
Node.jsの非同期(非同期)コールバックは、非同期の使用が知られている、プログラム、しかし、貧しいコードの可読性の効率を向上させます。
あなたはNode.jsのを使用する場合は、外出先の実行に必要なデータは、ネストされたレイヤーの上に移動する必要があります前に、操作が終了した後の動作後の復帰いくつかの非同期操作がある場合は、約束のターゲットが出て、この問題のために提案されていますソリューション。
基本コンセプト
オブジェクトの状態を約束:
pending
また、未定状態として知られている初期状態は、初期化プロミス、アクチュエータキュータ関数呼び出し後の状態です。fulfilled
非同期操作の成功ことを意味し、完了ステータス、。rejected
失敗した状態では、それが非同期操作が失敗したことを意味します。
これらは、主にプロミスpromise1.then方法は、値を()を返す基づいて、状態がこのオブジェクトに戻すことができる> pending-満たさのみの状態遷移pending->です。
状態一方向変換が不可逆的である、状態が決定されている(成立/拒否)元の状態にすることができない(保留)
状態が拒否されると、約束は、私たちが得たキャッチ例外情報を追加する必要がダウンし続けることができない
コールバック関数:
resolve
ときpending
に状態fulfilled
状態時にコールバック(操作が成功しました)reject
場合pending
の状態rejected
と、ステータスコールバックが(オペレーションが失敗した)
方法:- その後、()
- キャッチ()
- すべて()
- レース()
基本的な使用
new Promise(function(resolve,reject){
//这里面实现异步操作,ajax等..
//获得结果,回调传参
if(/*success*/){
resolve();
}else{
reject();
}
});
//虽然没有去执行setTimeOut函数,但是Promise会自动执行,所以,一般需要将Promise写在一个function里面
new Promise(function(resolve,reject){
setTimeout(function(){
let num = Math.random();
//当随机数小于0.5,当前promise完成了执行
if(num<0.5){
resolve(num);
}else{
reject("错误,num>=0.5");
}
console.log('执行完成');
},2000);
});
let p =new Promise(function(resolve,reject){
setTimeout(function(){
let num = Math.random();
//当随机数小于0.5,当前promise完成了执行
if(num<0.5){
resolve(num);
}else{
reject(num);
}
console.log('执行完成');
},2000);
});
p.then(function(data){
//这里的data是之前resolve中的回调参数
console.log(data);
},function(error){
//这里的error是之前resolve中的回调参数
console.log("错误原因为"+error);
});
高度な使用
その後、()
その後、プロミス(楽しい(解決、拒否))
p.then(function(data){
//这里的data是之前resolve中的回调参数
console.log(data);
},function(data){
//这里的data是之前resolve中的回调参数
console.log("错误");
console.log(data);
});
方法は、次に、コールバックパラメータを受信して処理することができる、方法は、プロミスオブジェクトを返します。ここでは、私たちの主な関心事は、リターン・プロミスオブジェクトの状態です。
この状態は、主被写体プロミスに戻ることができる)(promise1.thenに記載の方法で返される値です。
- 次に、()メソッドは、パラメータ値を返す場合、返される受信状態がプロミスとなるであろう。
- その後、()メソッドが例外をスローした場合、返される約束は、状態を拒否になります。
- その後、()メソッド呼び出しの解決()メソッドならば、約束のリターンは、状態を受信します。
- その後、()メソッドの呼び出しは()メソッドを拒否した場合、拒否された約束のリターン状態になります。
- 次に、()メソッドは、プロミスの新しいインスタンスを(保留中の)未知の状態を返した場合、新しいプロミスリターンが未知の状態です。
- その後、()メソッドが明示的に(データを)拒否/データを返す決意(データ)/時間を指定されていない場合は、新たに受信状態が約束を返され、層によって層を下に渡すことができます。
let p =new Promise(function(resolve,reject){
setTimeout(function(){
let num = Math.random();
//当随机数小于0.5,当前promise完成了执行
if(num<0.5){
resolve(num);
}else{
reject(num);
}
console.log('执行完成');
},2000);
});
p.then(function(data){
//用上次获得的数据执行相关的异步操作
},function(error){
//出现错误,处理错误信息
});
let p =new Promise(function(resolve,reject){
setTimeout(function(){
resolve("hello");
console.log('执行完成');
},2000);
});
p.then(function(data){
console.log(data);
}).then(function(){
setTimeout(function(){
console.log("过了5s,继续执行");
},5000);
});
キャッチ()
キャッチ()メソッドと、次いで()メソッドは、新しいプロミスオブジェクトを返すように、それは主に異常な非同期動作を取り込むときに使用されます。
したがって、我々は通常、第2のパラメータ()メソッドを省略し、その背後にキャッチ()関数のエラー処理制御。
次の2つのコードブロックが、機能は同じです。
let p =new Promise(function(resolve,reject){
setTimeout(function(){
let num = Math.random();
//当随机数小于0.5,当前promise完成了执行
if(num<0.5){
resolve(num);
}else{
reject(num);
}
console.log('执行完成');
},2000);
});
p.then(function(data){
//用上次获得的数据执行相关的异步操作
},function(error){
//出现错误,处理错误信息
});
let p =new Promise(function(resolve,reject){
setTimeout(function(){
let num = Math.random();
if(num<0.5){
resolve(num);
}else{
reject(num);
}
console.log('执行完成');
},2000);
});
p.then(function(data){
//用上次获得的数据执行相关的异步操作
}).catch(function(error){
//处理错误信息
});
レース()
引数は、そのようなアレイのような反復可能なオブジェクトであります
データを取得する必要があり、同時に同じURLに要求を送信し、2つの非同期タスク、廃棄される非同期タスクで得られ、さらにデータ
//2s后输出“执行完成1”
let p =new Promise(function(resolve){
setTimeout(function(){
resolve("hello");
console.log('执行完成1');
},2000);
});
//1s后输出“执行完成2”
let p1 =new Promise(function(resolve){
setTimeout(function(){
resolve("hello 2");
console.log('执行完成2');
},1000);
});
//两个异步任务同时开始
let mixedPromisesArray = [p,p1];
let p3 = Promise.race(mixedPromisesArray).then(data=>{
//这里的data为hello 2,hello被丢弃
console.log(data);
});
すべて()
反復パラメータはまた、そのようなアレイのようなオブジェクトであります
複数のタスクを並列に実行するときにそれを使用することができます
タスクが失敗すると、ステータスが拒否するように変更します
//2s后输出“执行完成1”
let p =new Promise(function(resolve){
setTimeout(function(){
resolve("hello");
console.log('执行完成1');
},2000);
});
//1s后输出“执行完成2”
let p1 =new Promise(function(resolve){
setTimeout(function(){
resolve("hello 2");
console.log('执行完成2');
},1000);
});
//两个异步任务同时开始
let mixedPromisesArray = [p,p1];
let p3 = Promise.all(mixedPromisesArray).then(data=>{
//这里的data数组,存放着之前两个异步回调传的数据
console.log(data);
});