首先,我很抱歉这个头衔,我不记得更好了。 我以为我理解Node.js / KOA,至少是基础,但现在我开始觉得我缺少一些基础知识。
看看以下代码:
router.put("/",
parse,
async function (ctx, next) {
// do something
await next();
},
async function (ctx, next) {
// do something
await next();
},
async function (ctx, next) {
if (some condition) {
gm(imageBuffer)
.quality(80)
.write(profile_path, async function (err) {
gm(imageBuffer)
.resize(60, 60)
.quality(80)
.write(chat_path,async function (err) {
await next(); // HERE 1
});
});
} else {
await next();
}
// HERE 2
},
async function (ctx, next) {
responses.success(ctx, "Success");
}
);
所以这就是全部。那些熟悉KOA框架的人会立即看到这里发生了什么。我的问题开始/结束的地方是第三个async function
。所以我在这里要做的是一些图像处理(保存)。 gm是异步的,但是你可以从代码中看到我正在使用匿名回调函数,而我想要实现的是当gm通过async function
完成时调用最后await next(); // HERE 1
。
但真正发生的是(根据我的理解)... gm异步启动..并且// HERE 2
被命中,并且由于没有任何东西,功能结束,KOA返回默认的404响应。我根本无法理解为什么会这样,以及如何克服这一点。
我真正想要的是当回调完成await next(); // HERE 1
被调用时,我可以返回成功响应。
当然await next(); // HERE 1
被调用(最终),但为时已晚,因为KOA已经回复了404。
如果有人能够并且愿意解释这里到底发生了什么,谢谢。
答案 0 :(得分:0)
据我所知,你的aproach并没有真正遵循异步await模式:async
函数应该“等待”异步部分。然后需要返回一个承诺。所以你必须用promise
来封装你的回调。像这样的东西可以起作用(不是testet,只是为了展示这个概念):
function gmAsync(){
return new Promise(function(resolve,reject){
gm(imageBuffer)
.quality(80)
.write(profile_path, async function (err) {
gm(imageBuffer)
.resize(60, 60)
.quality(80)
.write(chat_path,async function (err) {
resolve(....whatever....);
});
});
});
}
然后你的异步函数看起来像这样:
async function (ctx, next) {
if (some condition) {
await gmAsync()
next()
} else {
await next();
}
},
...
有道理吗?