当前位置: 首页 > news >正文

企业全称网站小程序直播

企业全称网站,小程序直播,口腔门诊建设网站,静态网页制作案例一、终极解决 异步操作是 JavaScript 编程的麻烦事#xff0c;麻烦到一直有人提出各种各样的方案#xff0c;试图解决这个问题。 从最早的回调函数#xff0c;到 Promise 对象#xff0c;再到 Generator 函数#xff0c;每次都有所改进#xff0c;但又让人觉得不彻底。…一、终极解决 异步操作是 JavaScript 编程的麻烦事麻烦到一直有人提出各种各样的方案试图解决这个问题。 从最早的回调函数到 Promise 对象再到 Generator 函数每次都有所改进但又让人觉得不彻底。它们都有额外的复杂性都需要理解抽象的底层运行机制。 异步I/O不就是读取一个文件吗干嘛要搞得这么复杂异步编程的最高境界就是根本不用关心它是不是异步。 async 函数就是隧道尽头的亮光很多人认为它是异步操作的终极解决方案。 二、async 函数是什么 一句话async 函数就是 Generator 函数的语法糖。 前文有一个 Generator 函数依次读取两个文件。 var fs require(fs); var readFile function (fileName){return new Promise(function (resolve, reject){fs.readFile(fileName, function(error, data){if (error) reject(error);resolve(data);});}); }; var gen function* (){var f1 yield readFile(/etc/fstab);var f2 yield readFile(/etc/shells);console.log(f1.toString());console.log(f2.toString()); };写成 async 函数就是下面这样。 var asyncReadFile async function (){var f1 await readFile(/etc/fstab);var f2 await readFile(/etc/shells);console.log(f1.toString());console.log(f2.toString()); };一比较就会发现async 函数就是将 Generator 函数的星号*替换成 async将 yield 替换成 await仅此而已。 三、async 函数的优点 async 函数对 Generator 函数的改进体现在以下三点。 1内置执行器。 Generator 函数的执行必须靠执行器所以才有了 co 函数库而 async 函数自带执行器。也就是说async 函数的执行与普通函数一模一样只要一行。 var result asyncReadFile(); 2更好的语义。 async 和 await比起星号和 yield语义更清楚了。async 表示函数里有异步操作await 表示紧跟在后面的表达式需要等待结果。 3更广的适用性。 co 函数库约定yield 命令后面只能是 Thunk 函数或 Promise 对象而 async 函数的 await 命令后面可以跟 Promise 对象和原始类型的值数值、字符串和布尔值但这时等同于同步操作。 四、async 函数的实现 async 函数的实现就是将 Generator 函数和自动执行器包装在一个函数里。 async function fn(args){// ... } // 等同于 function fn(args){ return spawn(function*() {// ...}); }所有的 async 函数都可以写成上面的第二种形式其中的 spawn 函数就是自动执行器。 下面给出 spawn 函数的实现基本就是前文自动执行器的翻版。 function spawn(genF) {return new Promise(function(resolve, reject) {var gen genF();function step(nextF) {try {var next nextF();} catch(e) {return reject(e); }if(next.done) {return resolve(next.value);} Promise.resolve(next.value).then(function(v) {step(function() { return gen.next(v); }); }, function(e) {step(function() { return gen.throw(e); });});}step(function() { return gen.next(undefined); });}); }async 函数是非常新的语法功能新到都不属于 ES6而是属于 ES7。目前它仍处于提案阶段但是转码器 Babel 和 regenerator 都已经支持转码后就能使用。 五、async 函数的用法 同 Generator 函数一样async 函数返回一个 Promise 对象可以使用 then 方法添加回调函数。当函数执行的时候一旦遇到 await 就会先返回等到触发的异步操作完成再接着执行函数体内后面的语句。 下面是一个例子。 async function getStockPriceByName(name) {var symbol await getStockSymbol(name);var stockPrice await getStockPrice(symbol);return stockPrice; } getStockPriceByName(goog).then(function (result){console.log(result); });上面代码是一个获取股票报价的函数函数前面的async关键字表明该函数内部有异步操作。调用该函数时会立即返回一个Promise对象。 下面的例子指定多少毫秒后输出一个值。 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);上面代码指定50毫秒以后输出hello world。 六、注意点 await 命令后面的 Promise 对象运行结果可能是 rejected所以最好把 await 命令放在 try…catch 代码块中。 async function myFunction() {try {await somethingThatReturnsAPromise();} catch (err) {console.log(err);} } // 另一种写法 async function myFunction() {await somethingThatReturnsAPromise().catch(function (err){console.log(err);}); }await 命令只能用在 async 函数之中如果用在普通函数就会报错。 async function dbFuc(db) {let docs [{}, {}, {}];// 报错docs.forEach(function (doc) {await db.post(doc);}); }上面代码会报错因为 await 用在普通函数之中了。但是如果将 forEach 方法的参数改成 async 函数也有问题。 async function dbFuc(db) {let docs [{}, {}, {}];// 可能得到错误结果docs.forEach(async function (doc) {await db.post(doc);}); }上面代码可能不会正常工作原因是这时三个 db.post 操作将是并发执行也就是同时执行而不是继发执行。正确的写法是采用 for 循环。 async function dbFuc(db) {let docs [{}, {}, {}];for (let doc of docs) {await db.post(doc);} }如果确实希望多个请求并发执行可以使用 Promise.all 方法。 async function dbFuc(db) {let docs [{}, {}, {}];let promises docs.map((doc) db.post(doc));let results await Promise.all(promises);console.log(results); } // 或者使用下面的写法 async function dbFuc(db) {let docs [{}, {}, {}];let promises docs.map((doc) db.post(doc));let results [];for (let promise of promises) {results.push(await promise);}console.log(results); }
http://www.zqtcl.cn/news/444080/

相关文章:

  • 大家都在哪些网站上做医药招商wordpress po文件
  • 国外主题网站兰州app
  • 建设项目自主验收公示网站dedecms英文外贸网站企业模板下载
  • 做网站要服务器吗前端企业网站开发
  • 用html写一个个人介绍多网站怎么做seo
  • 做网站打广告犯法吗中国建设投资集团 网站首页
  • 怎么免费申请个人网站职业技能培训有哪些
  • 小型的企业网站湖南备案网站建设方案书
  • 现在做网站公司seo怎么做教程
  • asp化妆品网站windows优化大师有必要安装吗
  • 网站流量分析系统制作图片网站
  • 做网站技术路线广州番禺发布公众号
  • 企业网站自己可以做吗服装网站建设的利益分析
  • 网站做软件居众装饰集团有限公司
  • 南山网站制作联系电话芒果国际影城星沙店
  • 珠海网站设计费用建企业版网站多久
  • linux 网站搬家wordpress 卸载plugin
  • 江苏省建设厅网站 投诉编辑网站的软件手机
  • 深圳地图各区分布图seo网络优化师就业前景
  • 北京网站备案代理国家企业信用信息公示系统广东
  • 推销网站重庆网站优化公司哪家便宜
  • 外贸公司网站搭建礼品网站建设
  • 网站建设 今晟网络中国制造网官网登录
  • 东莞网站设计如何常州做网站设计
  • php网站数据库修改网站备案有必要吗
  • 电商会学着做网站呢WordPress又拍云cdn
  • 网站健设推广产品多少钱网站规划有什么意义
  • 诚信网站备案中心内江网站建设新闻
  • 品牌形象网站有哪些百度应用中心
  • 网站建设找什么工作室甜点网站建设的功能及意义