Koa2中返回結(jié)果函數(shù)可包含異步過(guò)程是整,如果使用nodejs版本大于8,可以使用Async/Await墅垮;如果nodejs版本較低,函數(shù)也可以返回Promise耕漱,結(jié)果也能正確返回算色。
如果用戶請(qǐng)求中沒(méi)有異步的操作,當(dāng)然這很少見(jiàn)螟够,和其它語(yǔ)言中的過(guò)程沒(méi)有區(qū)別灾梦,但不涉及異步的過(guò)程貌似在Nodejs中沒(méi)有什么卵用,例如:
const Koa = require("koa");
const app = new Koa();
const Router = require("koa-router");
const router = new Router();
app.use(router.routes());
router.post(ctx => {
return 234 * 123;
});
app.listen(2333, () => { });
是沒(méi)什么卵用妓笙,原因是在涉及I/O的操作若河,如對(duì)數(shù)據(jù)庫(kù)、文件等的操作寞宫,在Nodejs中是異步的萧福,而順序執(zhí)行返回的結(jié)果有很大可能是不對(duì)的。例如上傳文件辈赋,考慮到如果用戶可能上傳較大文件鲫忍,我們一般采用流寫(xiě)入保存文件,否則需要將所有客戶端傳來(lái)的文件接受完畢并全部讀入內(nèi)存炭庙,再開(kāi)始寫(xiě)入饲窿,如果并發(fā)量大一些,系統(tǒng)就離著崩潰不遠(yuǎn)了焕蹄。因此我們需要等待文件流全部保存逾雄,才能返回結(jié)果。
要做到這一點(diǎn)腻脏,我們可以使用Async/Await鸦泳,但需要封裝流寫(xiě)入過(guò)程為Promise。如下:
function asyncRes() {
return new Promise((resolve, reject) => {
file.pipe(fs.createWriteStream(‘target.png’));
file.on(‘close’, err => {
if (err) {
reject({msg: ‘fail’})
}
resolve({msg: ‘success’})
})
}
}
接下來(lái)永品,在router中調(diào)用該函數(shù)做鹰。
const Koa = require("koa");
const app = new Koa();
const Router = require("koa-router");
const router = new Router();
app.use(router.routes());
router.post(async (ctx) => {
await asyncRes();
});
app.listen(2333, () => { });