关键词:async 、await、promise
这三个东西 可以优雅的解决异步问题。在学习koa2的时候遇到了获取数据后再进行模板渲染的异步问题。在查找各种资料后成功的解决了该问题,现在写个笔记记录一下。
先说一下async、await,第一次见到这两个词是在学习vue的时候。因为前端在写代码的时候经常的会遇到向后台请求数据这样的场景,等待数据返回才可以进行下一步的操作。这就不得不处理异步这种情况。
async、await基本的语法就是:
let asyncFn = async()=> { let data = null; data = await getData(url);//getData()返回的数据是 {name:'my name is data!'} console.log(data.name);//打印出的是my name is data! }
getData();为一个封装了请求数据的方法;
如果不处理异步的情况:
let notAsyncFn =()=> { let data = null; data = getData(url);//getData()返回的数据是 {name:'my name is data!'} console.log(data.name);//打印出的是undefined; 因为data此时还是null; }
await 命令后面的 函数返回的是一个Promise 对象,运行结果可能是 rejected,所以最好把 await 命令放在 try...catch 代码块中。
getData函数的代码:
var getData = function (url){ console.log("get start"); console.log(url); return new Promise(function (resolve, reject) { //下面的request()方法 是nodeJS的request模块; request(url, function (error, response, body) { if (!error && response.statusCode == 200) { resolve(response.body); }else{ //throw new Error(response.statusText) reject('===error==='); } }); }) console.log("get end"); }
promise的相关介绍可以移步 大白话讲解Promise(一)
还有await 命令只能用在 async 函数之中,如果用在普通函数,就会报错。
koa2中具体的代码:
/** * koa2路由代码 */ //引入router模块 var router = require('koa-router')(); //引入server模块 封装的请求函数 var server = require('../server'); //url 是假的额 写的百度的网址 const url = 'www.baidu.com'; router.get('/',async function (ctx,next){ var data = await server.get(url); console.log('======data====='); console.log(data); await ctx.render('myPage',{ title: '123wangcong', data: data }) }); module.exports = router;
/** * server模块的代码 */ node的request模块 var request = require('request'); module.exports = { get : function (url){ console.log("get start"); console.log(url); return new Promise(function (resolve, reject) { request(url, function (error, response, body) { if (!error && response.statusCode == 200) { resolve(response.body); }else{ //throw new Error(response.statusText) reject('error==='); } }); }) console.log("get end"); } }
把package也贴出来
{ "name": "koa2-demo", "version": "0.1.0", "scripts": { "start": "NODE_ENV=development ./node_modules/.bin/nodemon bin/run", "test1": "NODE_ENV=test ./node_modules/.bin/nodemon bin/run", "koa": "./node_modules/.bin/runkoa bin/www", "pm2": "pm2 start bin/run ", "test": "./node_modules/.bin/mocha -u bdd" }, "dependencies": { "co": "^4.6.0", "debug": "^2.2.0", "ejs": "^2.5.6", "jade": "~1.11.0", "koa": "^2.0.0", "koa-bodyparser": "^2.0.1", "koa-convert": "^1.2.0", "koa-json": "^1.1.1", "koa-logger": "^1.3.0", "koa-onerror": "^1.2.1", "koa-request": "^1.0.0", "koa-router": "^7.0.0", "koa-static": "^1.5.2", "koa-views": "^5.0.1", "runkoa": "^1.5.2" }, "devDependencies": { "mocha": "^2.4.5", "nodemon": "^1.9.1", "should": "^8.3.0", "supertest": "^1.2.0" } }
哦对了 async函数里可以多次使用await 语句,我以为只能用一次await!!!并不是的!!!!
async更详细的介绍可以 看这里 阮一峰async 函数的含义和用法
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
我对Javascript相当陌生,希望在谈到如何解决promise的顺序时,能对async/await做一点澄清。 假设我有一个异步函数,我们称之为foo,它检索某些内容,然后使用fs将其写入文件。promise图书馆。 我还有另一个异步函数,它将调用foo,然后在写入文件内容后对其进行处理——在网页上显示,进行计算,等等。 我希望确保在执行otherFileFunc之前,文件内容已写入,即wri
为了更好地理解异步控制流,我阅读了几篇stackoverflow文章、博客文章和Nodejs设计模式书。现在,我很容易编写常规回调传递样式(CPS)代码。然而,我试图摆脱这种习惯,提高代码的可读性(或者,避免“回调地狱”)。我的问题是,我似乎把、和理解为单独的概念以及如何使用它们。但是,我不确定如何利用它们将CPS函数转换为没有嵌套。 null
本文向大家介绍使用Promise解决多层异步调用的简单学习心得,包括了使用Promise解决多层异步调用的简单学习心得的使用技巧和注意事项,需要的朋友参考一下 前言 第一次接触到Promise这个东西,是2012年微软发布Windows8操作系统后抱着作死好奇的心态研究用html5写Metro应用的时候。当时配合html5提供的WinJS库里面的异步接口全都是Promise形式,这对那时候刚刚毕业
本文向大家介绍async/await让异步操作同步执行的方法详解,包括了async/await让异步操作同步执行的方法详解的使用技巧和注意事项,需要的朋友参考一下 一.前言 我们经常会遇到这样的麻烦事,多个函数按顺序执行,返回结果却不是我们预期的顺序,原因一般是由于异步操作引起的,所以呢,我们需要一种解决方案来处理这种问题,从而使得异步操作按照同步的方式来执行,这样我们就可以控制异步操作输出结果的
快速上手理解 先复制以下这段代码,在粘贴在chrome的控制台console中,按回车键执行 function getSyncTime() { return new Promise((resolve, reject) => { try { let startTime = new Date().getTime() setTimeout(() => {
本文向大家介绍从零学习node.js之详解异步控制工具async(八),包括了从零学习node.js之详解异步控制工具async(八)的使用技巧和注意事项,需要的朋友参考一下 前言 大家在编写异步程序时,最头痛的就是不知道结果什么时候返回给我们,然后执行后面的操作,很多时候只能把后面的操作放到返回成功的函数里,或者使用计数器等方法。 比较典型的两个就是:后面的操作需要依赖上一个异步操作的结果;多个