首页 > 语言 > JavaScript > 正文

NodeJs通过async/await处理异步的方法

2024-05-06 15:25:54
字体:
来源:转载
供稿:网友

场景

远古时代

我们在编写express后台,经常要有许多异步IO的处理。在远古时代,我们都是用chunk函数处理,也就是我们最熟悉的那种默认第一个参数是error的函数。我们来模拟一个Mongo数据库的操作,感受一下。

mongoDb.open(function(err, db){  if(!err){    db.collection("users", function(err, collection){      if(!err){        let person = {name: "yika", age: 20};        collection.insert(person, function(err, result){          if(!err){            console.log(result);          }        });      }    })  }});

这个也就是被我们所诟病的callback hell,一堆横向金字塔,如果将回调拆分成函数,则会变得非常支离破碎。为了防止到恶心到大家,我甚至没有写关于错误的处理,正常来说,每一个异步的操作都需要都它的error进行相应的显示或处理的。

Promise时代

后来进入了好一点的时代就是Promise,我们也可以称作链式操作。关于Promise,我也是之前有专门写过一系列的博文,有兴趣可以回头翻一下。这里来看看,将以上改写之后的状况。

let person = {name: "yika"};mongoDb  .open()  .then(function(database){   return database.collection("users");  })  .then(function(collection){   return collection.insert(person);  })  .then(function(result){   console.log(result);  })  .catch(function(e){   throw new Error(e);  })

我们可以看到,我们将金字塔已经平铺成一条线状结构了。相比之前恶心难以维护的chunk函数,变成了promise函数,并且错误的处理也变得十分优雅。但是我们仍然不可忽视某些问题,例如我们必须忍受各个逻辑被一个又一个的then()包裹起来,每一个函数都有其独立的作用域,如果为了共享某个数据就必须挂在最外层,最重要的还是,它与我们熟悉的同步编程仍然有差别。

Generator时代

TJ大神,借着ES6的Generator迭代器,最早实现了异步编程同步化的功能,也就是最为我们所熟知的co库。我们通过co(function *(){})可以使函数内部通过迭代器来控制。而co在这里则是充当了启动器的角色。关于Generator和co我在之前的博文也同样说过。

let co = require("co");co(function *(){  let db, collection, result;   let person = {name: "yika"};  try{    db = yield mongoDb.open();    collection = yield db.collection("users");    result = yield collection.insert(person);  }catch(e){    console.error(e.message);  }  console.log(result);});

我们已经非常接近同步编程了,在co包裹的函数内部,只有一个异步执行完毕,才会继续执行下面的代码。并且错误的处理也是通过try and catch进行实现的。不过我们不得不承认的是,迭代器终究不是为异步而存在的。里面的

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选