ホームページ > 記事 > ウェブフロントエンド > Nodejs の Promise オブジェクトについて詳しく見る
この記事では、Nodejs の Promise オブジェクトについて説明します。一定の参考値があるので、困っている友達が参考になれば幸いです。
#関連する推奨事項: 「nodejs チュートリアル 」
1. Promise は何に使用されますか?
私たちの要件は、非同期コードを 1 回実行することです。
私たちのアプローチは、非同期リクエストが成功した後のコールバック関数内にあります。次の非同期リクエストを実行します
しかし、これはコールバック地獄を引き起こします(コールバック関数がコールバック関数の中にネストされており、コードの可読性が低く、メンテナンスは変更されておらず、見るのが怖い) )
promise はコールバック地獄を解決するために使用されます
コールバック地獄の例:// 需求:一次的读取a,b,c这三个文件 const fs = require("fs"); // 读a文件 fs.readFile(`${__dirname}/etc/a.txt`, "utf-8", (err, data) => { if (err) { console.log(err); } else { console.log(data); // 读b文件 fs.readFile(`${__dirname}/etc/b.txt`, "utf-8", (err, data) => { if (err) { console.log(err); } else { console.log(data); // 读c文件 fs.readFile(`${__dirname}/etc/c.txt`, "utf-8", (err, data) => { if (err) { console.log(err); } else { console.log(data); } }); } }); } });
2. Promise ワークフロー
es6 構文、es6.ruanyifeng.com
Promise オブジェクトはコンストラクターであり、Promise インスタンスの生成に使用されます
Promise コンストラクターはパラメーターとして関数を受け入れます
この関数はパラメーターとして 2 つのパラメーターを持ちます, これら 2 つのパラメータは、resolve と拒否です
#これら 2 つのパラメータは関数でもありますが、これら 2 つの関数は JavaScript エンジンによって提供されるため、自分でデプロイする必要はありません非同期操作が成功した後に、resolve() メソッドが呼び出されます。内部的に then() の最初のパラメータ関数が呼び出されます。
The request( ) メソッドは、非同期操作が成功した後に呼び出されます。 、内部的に then() の 2 番目のパラメーター関数を呼び出します。
const fs = require("fs");
// 调用Promise构造函数,创建一个promise的实例
let p = new Promise((resolve, reject) => {
// 写异步操作(读文件)
fs.readFile(`${__dirname}/etc/a.txt`, "utf-8", (err, data) => {
if (!err) {
// 操作成功(读文件成功)
resolve(data); // 调用resolve方法
// 调用then()里面的第一个参数函数
} else {
reject(err); // 调用reject方法
// 调用then()里面的第二个参数函数
}
});
});
p.then(
(data) => {
console.log(data);
},
(err) => {
console.log(err);
}
);
3. Promise 原則
Promise オブジェクトは非同期操作を表します。##保留 (進行中)、履行 (成功)、および拒否 (失敗) の 3 つの状態があります。
Promise オブジェクトの状態が変化する可能性は 2 つだけです。保留中から実行済みへ、および保留中から拒否へです。
非同期操作の結果のみが現在の状態を決定でき、他の操作はこの状態を変更できません
非同期操作の場合 成功した場合(ファイルの読み取りに成功した場合)、保留中 (進行中) から完了済み (成功) に変わります。
非同期操作が失敗した場合 (ファイルの読み取りに失敗した場合)、保留中 (進行中) は拒否 (失敗) になります;
ステータスが決定された場合、再度変更されることはありません
4 . Promise の特性とカプセル化
Promise は作成後すぐに実行されます
なので、Promise には記述しないでください他のコードの場合は、この非同期操作のコードを記述するだけです
const fs = require("fs"); function getPromise(filename) { // 调用Promise构造函数,创建一个promise的实例 return new Promise((resolve, reject) => { // 写异步操作(读文件) fs.readFile(`${__dirname}/etc/${filename}.txt`, "utf-8", (err, data) => { if (!err) { // 操作成功(读文件成功) resolve(data); // 调用resolve方法 // 调用then()里面的第一个参数函数 } else { reject(err); // 调用reject方法 // 调用then()里面的第二个参数函数 } }); }); } // console.log(getPromise("a")); getPromise("a").then( (data) => { console.log(data); }, (err) => { console.log(err); } );
5。promise の正しい書き方
Promise がコールバック地獄を解決する方法
##->>チェーン プログラミングで解決する非同期操作は実際には非シーケンシャルです##**Promise を使用して解決する問題: 非同期操作に順序を持たせると、コールバック地獄はありません**
非同期操作をシーケンシャルにする本質は次のとおりです:
非同期操作が成功した後、コールバック関数で別の Promise を返し、そのメソッドを呼び出します
const fs = require("fs");
function getPromise(filename) {
// 调用Promise构造函数,创建一个promise的实例
return new Promise((resolve, reject) => {
// 写异步操作(读文件)
fs.readFile(`${__dirname}/etc/${filename}.txt`, "utf-8", (err, data) => {
if (!err) {
// 操作成功(读文件成功)
resolve(data); // 调用resolve方法
// 调用then()里面的第一个参数函数
} else {
reject(err); // 调用reject方法
// 调用then()里面的第二个参数函数
}
});
});
}
// console.log(getPromise("a"));
getPromise("a")
.then((data) => {
console.log(data);
//调用函数得到一个读b文件的promise对象并返回
return getPromise("b");
})
.then((data) => {
console.log(data);
//调用函数得到一个读c文件的promise对象并返回
return getPromise("c");
})
.then((data) => {
console.log(data);
});
6。Promise のその他のメソッド
catch()
間違った
const fs = require("fs"); function getPromise(filename) { // 调用Promise构造函数,创建一个promise的实例 return new Promise((resolve, reject) => { // 写异步操作(读文件) fs.readFile(`${__dirname}/etc/${filename}.txt`, "utf-8", (err, data) => { if (!err) { // 操作成功(读文件成功) resolve(data); // 调用resolve方法 // 调用then()里面的第一个参数函数 } else { reject(err); // 调用reject方法 // 调用then()里面的第二个参数函数 } }); }); } // console.log(getPromise("a")); getPromise("a") .then((data) => { console.log(data); //调用函数得到一个读b文件的promise对象并返回 return getPromise("b"); }) .then((data) => { console.log(data); //调用函数得到一个读c文件的promise对象并返回 return getPromise("c"); }) .then((data) => { console.log(data); }) .catch((err) => { console.log(err); });
## をキャッチできます#all()
const fs = require("fs"); function getPromise(filename) { // 调用Promise构造函数,创建一个promise的实例 return new Promise((resolve, reject) => { // 写异步操作(读文件) fs.readFile(`${__dirname}/etc/${filename}.txt`, "utf-8", (err, data) => { if (!err) { // 操作成功(读文件成功) resolve(data); // 调用resolve方法 // 调用then()里面的第一个参数函数 } else { reject(err); // 调用reject方法 // 调用then()里面的第二个参数函数 } }); }); } let p1 = getPromise("a"); let p2 = getPromise("b"); let p3 = getPromise("c"); // Promise.all()方法用于将多个 Promise 实例,包装成一个新的 Promise 实例 let pAll = Promise.all([p1, p2, p3]); // 一个都不能少,每一个promise都要读取成功才会成功,相当于是并且 pAll.then((data) => { console.log(data); });
race
const fs = require("fs"); function getPromise(filename) { // 调用Promise构造函数,创建一个promise的实例 return new Promise((resolve, reject) => { // 写异步操作(读文件) fs.readFile(`${__dirname}/etc/${filename}.txt`, "utf-8", (err, data) => { if (!err) { // 操作成功(读文件成功) resolve(data); // 调用resolve方法 // 调用then()里面的第一个参数函数 } else { reject(err); // 调用reject方法 // 调用then()里面的第二个参数函数 } }); }); } let p1 = getPromise("a"); let p2 = getPromise("b"); let p3 = getPromise("c"); // Promise.race()方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例 let pRace = Promise.race([p1, p2, p3]); // 只要有一个promise执行成功,那这个pRace就成功,相当于是或者 pRace.then((data) => { console.log(data); });
プログラミング ビデオ をご覧ください。 !
以上がNodejs の Promise オブジェクトについて詳しく見るの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。