詳解koa2學習中使用 async 、await、promise解決異步的問題
關(guān)鍵詞:async 、await、promise
這三個東西 可以優(yōu)雅的解決異步問題。在學習koa2的時候遇到了獲取數(shù)據(jù)后再進行模板渲染的異步問題。在查找各種資料后成功的解決了該問題,現(xiàn)在寫個筆記記錄一下。
先說一下async、await,第一次見到這兩個詞是在學習vue的時候。因為前端在寫代碼的時候經(jīng)常的會遇到向后臺請求數(shù)據(jù)這樣的場景,等待數(shù)據(jù)返回才可以進行下一步的操作。這就不得不處理異步這種情況。
async、await基本的語法就是:
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();為一個封裝了請求數(shù)據(jù)的方法;
如果不處理異步的情況:
let notAsyncFn =()=> {
let data = null;
data = getData(url);//getData()返回的數(shù)據(jù)是 {name:'my name is data!'}
console.log(data.name);//打印出的是undefined; 因為data此時還是null;
}
await 命令后面的 函數(shù)返回的是一個Promise 對象,運行結(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)介紹可以移步 大白話講解Promise(一)
還有await 命令只能用在 async 函數(shù)之中,如果用在普通函數(shù),就會報錯。
koa2中具體的代碼:
/**
* koa2路由代碼
*/
//引入router模塊
var router = require('koa-router')();
//引入server模塊 封裝的請求函數(shù)
var server = require('../server');
//url 是假的額 寫的百度的網(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也貼出來
{
"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函數(shù)里可以多次使用await 語句,我以為只能用一次await?。。〔⒉皇堑模。。?!
async更詳細的介紹可以 看這里 阮一峰async 函數(shù)的含義和用法
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
node koa2實現(xiàn)上傳圖片并且同步上傳到七牛云存儲
這篇文章主要介紹了node koa2實現(xiàn)上傳圖片并且同步上傳到七牛云存儲,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07
nodejs報digital?envelope?routines::unsupported錯誤的最新解決方法
這篇文章主要介紹了nodejs報digital?envelope?routines::unsupported錯誤的最新解決方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-02-02
node將geojson轉(zhuǎn)shp返回給前端的實現(xiàn)方法
這篇文章主要介紹了node將geojson轉(zhuǎn)shp返回給前端的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-05-05
node異步使用await和不用await的區(qū)別實例分析
這篇文章主要介紹了node異步使用await和不用await的區(qū)別,結(jié)合實例形式分析了node.js異步使用await和不用await的實例中,同步與異步執(zhí)行的區(qū)別,需要的朋友可以參考下2023-06-06
NodeJS實現(xiàn)微信公眾號關(guān)注后自動回復功能
這篇文章主要為大家詳細介紹了NodeJS實現(xiàn)微信公眾號關(guān)注后自動回復功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05

