>  기사  >  웹 프론트엔드  >  Nodejs의 Promise 객체에 대해 자세히 알아보세요.

Nodejs의 Promise 객체에 대해 자세히 알아보세요.

青灯夜游
青灯夜游앞으로
2021-03-30 18:44:342101검색

이 글에서는 Nodejs의 Promise 객체를 살펴보겠습니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.

Nodejs의 Promise 객체에 대해 자세히 알아보세요.

관련 추천: "nodejs tutorial"

Promise object

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);
  }
);

3. Promise 원칙

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);
  }
);

5. 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);
      });
  • 모두 ()

    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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제