ホームページ  >  記事  >  ウェブフロントエンド  >  Nodejs の Promise オブジェクトについて詳しく見る

Nodejs の Promise オブジェクトについて詳しく見る

青灯夜游
青灯夜游転載
2021-03-30 18:44:342100ブラウズ

この記事では、Nodejs の Promise オブジェクトについて説明します。一定の参考値があるので、困っている友達が参考になれば幸いです。

Nodejs の Promise オブジェクトについて詳しく見る

#関連する推奨事項: 「

nodejs チュートリアル

Promise オブジェクト

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 サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。