이 글에서는 Nodejs의 Promise 객체를 살펴보겠습니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.
관련 추천: "nodejs tutorial"
1. Promise는 무엇에 사용되나요?
우리의 요구 사항은 비동기 코드를 한 번 실행하는 것입니다.
우리의 접근 방식은 비동기 요청이 성공한 후 콜백 함수에서 다음 비동기 요청을 실행하는 것입니다.
그러나 이로 인해 콜백 지옥이 발생합니다. 코드의 가독성이 낮고 유지 관리가 변경되지 않아 사람들이 겁을 먹습니다)
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 생성자는 함수를 매개변수로 받아들입니다
이 함수는 매개변수로 두 개의 매개변수가 더 있습니다. 이 두 매개변수도 함수이지만 이 두 함수는 자바스크립트 엔진에서 제공하므로 직접 배포할 필요가 없습니다. 비동기 작업이 성공한 후, 내부적으로 then()의 첫 번째 매개변수 함수가 호출됩니다. then()의 첫 번째 매개변수 함수.
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); } );
Promise 객체는 비동기 작업을 나타냅니다.
세 가지 상태가 있습니다: 보류 중(진행 중) 이행(성공) 및 거부(실패)Promise 개체의 상태 변경에는 보류에서 이행으로, 보류에서 거부로 두 가지 가능성만 있습니다.
비동기 작업의 결과만이 현재 상태를 결정할 수 있으며 다른 작업은 이 상태를 변경할 수 없습니다.
비동기 작업이 성공하면(파일을 성공적으로 읽음) 보류 중(진행 중)에서 변경됩니다. )이 완료(성공)됩니다.
비동기 작업이 실패하면(파일 읽기 실패) 보류(진행 중)에서 거부(실패)로 변경됩니다.
상태가 결정되면 not 이 상태를 다시 변경해 보겠습니다
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);
}
);
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); });
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); });
모두 ()
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!