promise和async

Promise

回调地狱

const fs = require('fs');

fs.readFile('./data/a.txt', 'utf8', (err, dataA) => {
  if (err) {
    throw err;
  }
  fs.readFile('./data/b.txt', 'utf8', (err, dataB) => {
    if (err) {
      throw err;
    }
    fs.readFile('./data/c.txt', 'utf8', (err, dataC) => {
      if (err) {
        throw err;
      }
      fs.readFile('./data/d.txt', 'utf8', (err, dataD) => {
        if (err) {
          throw err;
        }
        fs.writeFile('./data/e.txt', dataA + dataB + dataC + dataD, (err) => {
          if (!err) {
            console.log('success');
          }
        })
      });
    });
  });
});

Promise概念

Promise是ES6中新增的一个构造函数。

  • 目的

    解决回调地狱的问题

  • 一个容器,用来封装一个异步任务

  • 三种状态

    • Pending 异步任务正在执行
    • Resolved 成功执行
    • Rejected 执行失败

Promise基本使用

  • 使用Promise封装一个异步任务
const fs = require('fs');
const p = new Promise(function (resolve, reject) {
  fs.readFile('./data/a.txt', 'utf-8', (err, data) => {
    if (err) {
      reject(err);
    } else {
      resolve(data);
    }
  });
});
  • 调用
p.then((data) => {
  // 传递给容器的resolve函数
  console.log(resove);
}, (err) => {
  // 传递给容器的reject函数
  console.log(err);
});

then和catch

then执行Promise中的resolve函数,catch执行Promise中的reject函数

const fs = require('fs');

const p1 = new Promise(function (resolve, reject) {
  fs.readFile('./data/a.txt', 'utf-8', (err, data) => {
    if (err) {
      reject(err);
    } else {
      resolve(data);
    }
  });
});

const p2 = new Promise(function (resolve, reject) {
  fs.readFile('./data/b.txt', 'utf-8', (err, data) => {
    if (err) {
      reject(err);
    } else {
      resolve(data);
    }
  });
});

const p3 = new Promise(function (resolve, reject) {
  fs.readFile('./data/c.txt', 'utf-8', (err, data) => {
    if (err) {
      reject(err);
    } else {
      resolve(data);
    }
  });
});

p1
  .then((d) => {
    console.log(d);
    return p2;
  })
  .then((d1) => {
    console.log(d1);
    return p3;
  })
  .then((d2) => {
    console.log(d2);
  });

Promise封装

const fs = require('fs');

function openFile(filePath) {
  return new Promise(function (resolve, reject) {
    fs.readFile(filePath, 'utf-8', (err, data) => {
      if (err) {
        reject(err);
      } else {
        resolve(data);
      }
    });
  });
}

openFile('./data/a.txt')
  .then((data) => {
    console.log(data);
    return openFile('./data/b.txt');
  })
  .then((data) => {
    console.log(data);
  })

async 函数

ES2017引入了 async 函数,目的是简化异步操作。

使用 async 的目的,是调用异步操作的时候,不需要写回调函数

async function fn() {
  const a = await 1;
  console.log(a);
}
fn();

await使用的时候必须在 async 函数中,await 后跟Promise对象才有意义

const fs = require('fs');

function openFile(filePath) {
  return new Promise(function (resolve, reject) {
    fs.readFile(filePath, 'utf-8', (err, data) => {
      if (err) {
        reject(err);
      } else {
        resolve(data);
      }
    });
  });
}

async function main() {
  const data = await openFile('./data/a.txt');
  const data2 = await openFile('./data/b.txt');

  console.log(data);
  console.log(data2);
}
main();

如果 async 函数 有返回值的情况

  1. 如果返回Promise对象,直接返回
  2. 如果返回普通数据会转换成Promise对象
const fs = require('fs');

async function main() {
  const a = 1;
  return a;

  // 相当于 
  // return new Promise(function (resolve, reject) {
  //   resolve(1);
  // });
}

const result = main();
// console.log(result);
result.then((data) => {
  console.log(data);
});

你可能感兴趣的:(promise和async)