Node.js 异步/等待承诺。所有转换问题

Node.js 异步/等待承诺。所有转换问题,node.js,async-await,Node.js,Async Await,我有以下在异步函数中工作的代码,但它是串行运行的 const streamPromise = stream => new Promise((res, rej) => { stream.on( 'end', () => res('end') ); stream.on( 'finish', () => res( stream.read() ) ); stream.on( 'error', e => rej(e) ); }); for (var

我有以下在异步函数中工作的代码,但它是串行运行的

const streamPromise = stream => new Promise((res, rej) => {
    stream.on( 'end', () => res('end') );
    stream.on( 'finish', () => res( stream.read() ) );
    stream.on( 'error', e => rej(e) );
});

for (var obj of lookupMd5) {
    console.log(`Working on ${obj}`);
    const hash = crypto
            .createHash('md5')
            .setEncoding('hex');
    const readStream = s3.getObject({Bucket: bucket, Key: obj}).createReadStream();
    readStream.on('error', err => {
        console.error('s3 download error', err);
        hash.emit('error', err);
    });
    readStream.pipe(hash);

    const md5 = await streamPromise(hash);
    console.log('md5', md5);

    haveMd5.push( { Key: obj.replace(prefix, ''), Md5: md5 } );
}
要转换为并行运行的代码,请使用

const streamPromise = stream =>
    new Promise((res, rej) => {
        stream.on('end', () => res('end'));
        stream.on('finish', () => res(stream.read()));
        stream.on('error', e => rej(e));
    });

const md5s = Promise.all(
    lookupMd5.map(obj => {
        console.log(`Working on ${obj}`);
        const hash = crypto.createHash('md5').setEncoding('hex');
        const readStream = s3.getObject({ Bucket: bucket, Key: obj }).createReadStream();
        readStream.on('error', err => {
            console.error('s3 download error', err);
            hash.emit('error', err);
        });
        readStream.pipe(hash);

        return { Key: obj.replace(prefix, ''), Md5: await streamPromise(hash) };
    })
);
console.log('md5s', JSON.stringify(md5s, null, 2));
但是在
Md5:await streamPromise(hash)
的我的对象中获取一个意外的标记“streamPromise”时出错

如果我更改为,则在同一位置出现意外标记“streamPromise”

const streamPromise = async stream => {
    stream.on( 'end', () => 'end' );
    stream.on('finish', () => stream.read());
    stream.on('error', e => { throw e });
};

const md5s = Promise.all(
    lookupMd5.map(obj => {
        console.log(`Working on ${obj}`);
        const hash = crypto.createHash('md5').setEncoding('hex');
        const readStream = s3.getObject({ Bucket: bucket, Key: obj }).createReadStream();
        readStream.on('error', err => {
            console.error('s3 download error', err);
            hash.emit('error', err);
        });
        readStream.pipe(hash);

        return { Key: obj.replace(prefix, ''), Md5: await streamPromise(hash) };
    })
);

console.log('md5s', JSON.stringify(md5s, null, 2));

async
函数中,可能的副本只能
等待
。解决这个问题,然后等待md5s的承诺。所有的,代码都应该工作。映射功能是问题吗?更改为
lookupMd5.map(async obj=>{
仍然不工作,不断返回一个空对象
{}
,您还需要等待
承诺。所有的
,就像我说的