Затем Promise.all() вызывается до того, как обещание resolve() будет завершено.

Я новичок в узле. Попытка создать сервис, который будет вызывать AWS для загрузки нескольких изображений и возврата ключей AWS клиенту. Здесь я использую Promise all, чтобы завершить все вызовы AWS и получить ключи AWS, а затем вернуть связку ключей клиенту.

Но я удивлен, что Promise.all() then() вызывается перед Promise resolve(). Очень нужна помощь. Простите меня за мой плохой код узла.

server.post('/photo', function (req, res, next) {

    var form = new formidable.IncomingForm();
    var result = [];

    form.on('progress', function(bytesReceived, bytesExpected) {
        console.log('err');
    });

    form.on('error', function(err) {
        console.log('err',err);
    });

    form.on('end', function() {
        console.log('ended!!!!', arguments);
    });

    form.on('aborted', function() {
        console.log('aborted', arguments);
    });

    var urls = processAllFiles(form);
    Promise.all([urls]).then(function(result) {
        console.log('[][][]', urls);
    }).catch(function (err){
        console.log(err);
    });
    form.parse(req, function(err, fields, files) {
        console.log('am at parse');
        res.writeHead(200, {'content-type': 'text/plain'});
        res.write('received upload:\n\n', urls);
        res.end('received files:\n\n '+util.inspect(files));
    })
    return;

}) 

function processAllFiles(form) {
    var result = [];
    return new Promise(function (resolve, reject)
    {   try{
        form.onPart = function (part) {
            const params = {
                Bucket: 'xxxxx',
                Key: uuidv4() + part.filename
            };

            var upload = s3Stream.upload(params);

            upload.on('error', function (error) {
                console.log('errr', error);
            });
            upload.on('part', function (details) {
                console.log('part', details);
            });
            upload.on('uploaded', function (details) {
                result.push(details);
                console.log('uploaded', result);
            })
            part.pipe(upload);
        }
        resolve(result);
    } catch(exception){
        reject('error');
    }

    })
}

person user3336194    schedule 05.01.2018    source источник


Ответы (2)


upload.on('uploaded', function (details) {
            result.push(details);
            console.log('uploaded', result);
            resolve(result);
        })

Я думаю, вы должны указать разрешение в обратном вызове асинхронной функции.

person Timothy Lee    schedule 05.01.2018

Функция processAllFiles возвращает только 1 обещание, поэтому Promise.all() не нужен. Вы можете сделать это напрямую. processAllFiles.then(...) Обратите внимание, что Node.js является асинхронным, поэтому порядок, в котором вы вызываете вещи, может не соответствовать ожидаемому (в отличие от синхронных вызовов).

person Ivan Shen    schedule 05.01.2018
comment
Хорошо, спасибо за ваш комментарий. Я удалил Promise.All() и вызвал непосредственно processAllFiles.then(...), но я вижу, что then() выполняется до разрешения(). - person user3336194; 05.01.2018