koa2學(xué)習(xí)中使用 async 、await、promise解決異步的問題

關(guān)鍵詞:async 、await、promise

這三個東西 可以優(yōu)雅的解決異步問題。在學(xué)習(xí)koa2的時候遇到了獲取數(shù)據(jù)后再進行模板渲染的異步問題。在查找各種資料后成功的解決了該問題,現(xiàn)在寫個筆記記錄一下。

先說一下async、await,第一次見到這兩個詞是在學(xué)習(xí)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?。?!并不是的?。。。?/p>

async更詳細的介紹可以 看這里 阮一峰async 函數(shù)的含義和用法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容