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=>{
仍然不工作,不断返回一个空对象{}
,您还需要等待承诺。所有的
,就像我说的