async(异步) 函数

async 函数是 Generator 函数的语法糖。

Generator 函数,依次读取两个文件


const fs = require('fs');

const readFile = function (fileName) {
  return new Promise(function (resolve, reject) {
    fs.readFile(fileName, function(error, data) {
      if (error) return reject(error);
      resolve(data);
    });
  });
};

const gen = function* () {
  const f1 = yield readFile('/e/f');
  const f2 = yield readFile('/e/s');
  console.log(f1.toString());
  console.log(f2.toString());
};

写成async函数

const asyncReadFile = async function () {
  const f1 = await readFile('/etc/fstab');
  const f2 = await readFile('/etc/shells');
  console.log(f1.toString());
  console.log(f2.toString());
};

Generator 函数与async函数的区别;

  • Generator 函数的执行必须靠执行器,async函数自带执行器;

  • async和await,比起星号和yield,语义更清楚了。async表示函数里有异步操作,await表示紧跟在后面的表达式需要等待结果

  • yield命令后面只能是 Thunk 函数或 Promise 对象,而async函数的await命令后面,可以是 Promise 对象和原始类型的值

  • async函数的返回值是 Promise 对象,这比 Generator 函数的返回值是 Iterator 对象

async 函数让异步任务编程写成类似同步任务,可读性再次提升;

function timeout(ms) {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
}

async function asyncPrint(value, ms) {
  await timeout(ms);
  console.log(value);
}

asyncPrint('hello world', 50);

注意事项

  • async函数内部抛出错误,会导致返回的 Promise 对象变为reject状态。抛出的错误对象会被catch方法回调函数接收到。所以尽量把await命令放在try...catch代码块中
async function myFunction() {
  try {
    await somethingThatReturnsAPromise();
  } catch (err) {
    console.log(err);
  }
}
  • async函数返回的 Promise 对象,必须等到内部所有await命令后面的 Promise 对象执行完,才会发生状态改变,除非遇到return语句或者抛出错误
async function getTitle(url) {
  let response = await fetch(url);
  let html = await response.text();
  return html.match(/<title>([\s\S]+)<\/title>/i)[1];
}
getTitle('https://tc39.github.io/ecma262/').then(console.log)
// "ECMAScript 2017 Language Specification"
  • await命令只能用在async函数之中,如果用在普通函数,就会报错
async function dbFuc(db) {
  let docs = [{}, {}, {}];

  // 报错
  docs.forEach(function (doc) {
    await db.post(doc);
  });
}

作用可以用async/await将Promise的链式调用优化,使看起来像同步代码

function delay (time){
  return new Promise((resolve,reject)=>{
    setTimeout(()=>{
      resolve(time);
    },time)
  })
}

async function fn(){
  console.log("start");
  let time1 = await delay(1000);
  console.log(`${time1}ms passed`);
   let time2 = await delay(3000);
  console.log(`${time2}ms passed`);
  
}

fn().catch(err=>{
  console.log(err)
})
function getIp() {
  var promise = new Promise(function(resolve, reject){
    var xhr = new XMLHttpRequest()
    xhr.open('GET', 'https://easy-mock.com/mock/5ac2f80c3d211137b3f2843a/promise/getIp', true)
    xhr.onload = function(){
      var retJson = JSON.parse(xhr.responseText)  // {"ip":"58.100.211.137"}
      resolve(retJson.ip)
    }
    xhr.onerror = function(){
      reject('获取IP失败')
    }
    xhr.send()
  })
  return promise
}

function getCityFromIp(ip) {
  var promise = new Promise(function(resolve, reject){
    var xhr = new XMLHttpRequest()
    xhr.open('GET', 'https://easy-mock.com/mock/5ac2f80c3d211137b3f2843a/promise/getCityFromIp?ip='+ip, true)
    xhr.onload = function(){
      var retJson = JSON.parse(xhr.responseText)  // {"city": "hangzhou","ip": "23.45.12.34"}
      resolve(retJson.city)
    }
    xhr.onerror = function(){
      reject('获取city失败')
    }
    xhr.send()
  })
  return promise
}
function getWeatherFromCity(city) {
  var promise = new Promise(function(resolve, reject){
    var xhr = new XMLHttpRequest()
    xhr.open('GET', 'https://easy-mock.com/mock/5ac2f80c3d211137b3f2843a/promise/getWeatherFromCity?city='+city, true)
    xhr.onload = function(){
      var retJson = JSON.parse(xhr.responseText)   //{"weather": "晴天","city": "beijing"}
      resolve(retJson)
    }
    xhr.onerror = function(){
      reject('获取天气失败')
    }
    xhr.send()
  })
  return promise
}

async function start(){
  let ip = await getIp();
  console.log(ip);
  let cityInfo = await getCityFromIp(ip);
  console.log(cityInfo);
  let weatherInfo = await getWeatherFromCity(cityInfo.city);
  console.log(weatherInfo.weather)
  
}
start()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • “呀!好可爱的小猫!” 少女放下手里的东西,把小猫抱在怀里。小猫有气无力地发出低吟,傲娇地企图挣脱少女的怀抱。 “...
    敏宅阅读 231评论 0 0
  • 这周在复习雅思,一天至少7个小时按计划推进,连续5天,自己都觉得挺意外的,高考之后这样主动长时间高效率学习的状态几...
    钟西贝阅读 1,673评论 1 50
  • 到底产品需要啥工具来开展工作?如果让不同工作经历的产品经理来列举,相信会有一个长长的列表,像Axure原型工具、A...
    了解阁阅读 425评论 8 3
  • 作者:钱国宏 人生七十古来稀,俺娘今年整八十七。 娘出身名门望族,随父亲半生戎马,蓬叶漂泊,中年才得以在乡间一隅扎...
    北方农村阅读 484评论 2 5
  • 母亲节到了,准备陪她二老吃饭! 多些陪伴!看着妈妈衰老的背影,心很酸!现在唯一能做的是多些陪伴! 现在学会了做饭,...
    小涛ps微凉阅读 154评论 0 1