Во-первых, извиняюсь за название, ничего лучше не придумал. Я думал, что понимаю 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 является асинхронным, но, как вы можете видеть из кода, я использую анонимные функции обратного вызова, и я пытаюсь добиться того, чтобы последний async function
вызывался, когда gm заканчивает через await next(); // HERE 1
.
Но что на самом деле происходит (насколько я понимаю)... gm запускается асинхронно... и // HERE 2
срабатывает, и поскольку ничего нет, конец функции, KOA возвращает ответ 404 по умолчанию. Я просто не могу понять, почему это так и как это побороть. Что я действительно хочу, так это то, что когда обратный вызов завершается, await next(); // HERE 1
вызывается, и я могу вернуть ответ об успешном завершении. await next(); // HERE 1
, конечно, вызывают (в конце концов), но слишком поздно, потому что KOA уже отвечает 404.
Если есть кто-то, кто может и хочет объяснить, что именно здесь происходит, спасибо.