Поток кода с библиотечным методом. Результат не такой, как ожидалось - PullRequest
1 голос
/ 01 августа 2020

[ чего я пытаюсь достичь ]: загрузить набор изображений, затем вернуть имя изображения и имя изображения с измененным размером

У меня есть код для изменения размера изображений большого размера. Почему мой код выводит ожидаемый результат? в этом заказе.

В моем ниже выводе:

before
after
resize_image_outputpath

но я хочу это:

before
resize_image_outputpath
after
app.post('/upload', upload.array('file'), (req, res) => {
var imagelist = [];

(req.files).forEach(function (file) {
    if (file.mimetype == 'image/jpeg' || file.mimetype == 'image/png') {
        imagelist.push([file.originalname, __basefolder  + file.originalname]);
        var sizeOf = require('image-size');
        
        console.log("before");
        sizeOf(__basefolder + file.originalname, async function (err, dimensions) {
            if (dimensions.width > 128 && dimensions.height > 128) {
                const resize_2 = await resizeImage1(__basefolder, file.originalname, dimensions, 2);
                imagelist.push([resize_2, 2+"___"+file.originalname]);
            }
        });
        console.log("after");
    }
});
res.json(imagelist);
const file = req.file;

});

//resize images. reduce image size as per divisor value.
async function resizeImage1(folder, fileName, dimensions, divisor) {
    console.log("resize_image_outputpath ");
};

1 Ответ

0 голосов
/ 01 августа 2020

Чтобы ответить на вопрос:

Почему мой код производит вывод

Вы повторяете файлы в своем запросе. При этом вы сначала звоните:

console.log('before')

Затем вы звоните sizeOf(). Он планирует обратный вызов, который вы передаете для выполнения позже, в каком-то другом стеке.

Затем вы вызываете:

console.log("after")

Затем выполняется запланированный вами обратный вызов, и вы нажимаете resizeImage1() который вызывает:

console.log("resize_image_outputpath ");

Вот почему ваш результат:

before
after
resize_image_outputpath

Я не уверен, почему вы ожидаете, что console.log("after") выполнится до console.log('before'), учитывая что код выполняется сверху вниз, за ​​исключением asyn c -scheduled callback.

Изменить

Вы можете попробовать что-то вроде:

app.post('/upload', upload.array('file'), (req, res) => {
var imagelist = [];

(req.files).forEach(async function (file) {
    if (file.mimetype == 'image/jpeg' || file.mimetype == 'image/png') {
        imagelist.push([file.originalname, __basefolder  + file.originalname]);
        var sizeOf = require('image-size');

        console.log("before");
        await new Promise(resolve => {
          sizeOf(__basefolder + file.originalname, function (err, dimensions) {
              if (dimensions.width > 128 && dimensions.height > 128) {
                  const resize_2 = resizeImage1(__basefolder, file.originalname, dimensions, 2);
                  
                  imagelist.push([resize_2, 2+"___"+file.originalname]);
              }
              resolve()
          });
        });
        console.log("after");
    }
});
res.json(imagelist);
const file = req.file;

Это приведет к появлению журналов в ожидаемом вами порядке.

...