国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

詳解koa2學習中使用 async 、await、promise解決異步的問題

2019-11-19 12:31:46
字體:
來源:轉載
供稿:網友

關鍵詞: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 函數的含義和用法

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 南京市| 雅安市| 阿鲁科尔沁旗| 龙江县| 孝昌县| 方城县| 秀山| 余江县| 丽江市| 兴海县| 堆龙德庆县| 邢台县| 富锦市| 甘泉县| 同德县| 马龙县| 阆中市| 丽江市| 平阳县| 道真| 弋阳县| 南陵县| 剑阁县| 莱阳市| 西城区| 文登市| 曲麻莱县| 都昌县| 宣汉县| 贵港市| 玛纳斯县| 阳山县| 凤山县| 二连浩特市| 福清市| 永安市| 莎车县| 衡阳县| 延川县| 合作市| 南陵县|