您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)koa2中使用async 、await、promise解決異步問(wèn)題的示例分析的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。
關(guān)鍵詞:async 、await、promise
這三個(gè)東西 可以?xún)?yōu)雅的解決異步問(wèn)題。在學(xué)習(xí)koa2的時(shí)候遇到了獲取數(shù)據(jù)后再進(jìn)行模板渲染的異步問(wèn)題。在查找各種資料后成功的解決了該問(wèn)題,現(xiàn)在寫(xiě)個(gè)筆記記錄一下。
先說(shuō)一下async、await,第一次見(jiàn)到這兩個(gè)詞是在學(xué)習(xí)vue的時(shí)候。因?yàn)榍岸嗽趯?xiě)代碼的時(shí)候經(jīng)常的會(huì)遇到向后臺(tái)請(qǐng)求數(shù)據(jù)這樣的場(chǎng)景,等待數(shù)據(jù)返回才可以進(jìn)行下一步的操作。這就不得不處理異步這種情況。
async、await基本的語(yǔ)法就是:
let asyncFn = async()=> { let data = null; data = await getData(url);//getData()返回的數(shù)據(jù)是 {name:'my name is data!'} console.log(data.name);//打印出的是my name is data! }
getData();為一個(gè)封裝了請(qǐng)求數(shù)據(jù)的方法;
如果不處理異步的情況:
let notAsyncFn =()=> { let data = null; data = getData(url);//getData()返回的數(shù)據(jù)是 {name:'my name is data!'} console.log(data.name);//打印出的是undefined; 因?yàn)閐ata此時(shí)還是null; }
await 命令后面的 函數(shù)返回的是一個(gè)Promise 對(duì)象,運(yùn)行結(jié)果可能是 rejected,所以最好把 await 命令放在 try...catch 代碼塊中。
getData函數(shù)的代碼:
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的相關(guān)介紹可以移步 大白話(huà)講解Promise(一)
還有await 命令只能用在 async 函數(shù)之中,如果用在普通函數(shù),就會(huì)報(bào)錯(cuò)。
koa2中具體的代碼:
/** * koa2路由代碼 */ //引入router模塊 var router = require('koa-router')(); //引入server模塊 封裝的請(qǐng)求函數(shù) var server = require('../server'); //url 是假的額 寫(xiě)的百度的網(wǎng)址 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也貼出來(lái)
{ "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" } }
哦對(duì)了 async函數(shù)里可以多次使用await 語(yǔ)句,我以為只能用一次await?。?!并不是的!!??!
async更詳細(xì)的介紹可以 看這里 阮一峰async 函數(shù)的含義和用法
感謝各位的閱讀!關(guān)于“koa2中使用async 、await、promise解決異步問(wèn)題的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。