gpt4 book ai didi

javascript - 函数执行完成之前执行的回调

转载 作者:太空宇宙 更新时间:2023-11-03 23:11:54 29 4
gpt4 key购买 nike

您好,我遇到这个问题,每当我执行此代码时,回调都会在主函数完成执行之前执行。我相信这与异步函数有关

var leers3 = async function (next) {
var executed = [];
AWS.config.update({
region: '********',
accessKeyId: '*********',
secretAccessKey: '*********'
});

var s3 = new AWS.S3();

s3.listObjects({Bucket:'*******'}, function(err, data) {
if (err) {
console.log(fechaActual() + " Error: Error ejecutando cruce con S3.")
}else{
var files = [];
data.Contents.forEach(function(obj,index){
if(obj.Key.startsWith("*****") || obj.Key.startsWith("*****")){
files.push(obj.Key);
}
})
files.forEach((file) => {
var id_cajero = file.split('_')[1];
var params = {Bucket:'*****', Key: file};
var sql = "SELECT id_entidad FROM cajero WHERE id_cajero = '" + id_cajero + "';";
dbConnection.query(sql, async(err,result) => {
if(err) console.log(err);
else{
var fileExecutedData = await leerarchivos3(params, s3, id_cajero, result[0].id_entidad);
fileExecutedData.file = file;
executed.push(fileExecutedData);
//console.log(executed);
}
})
next(executed);
})
}
})
};

leers3((executed) => {
console.log(executed);
});

最佳答案

forEach并非旨在处理/执行 promise 和异步代码。 forEach被设计为同步操作。这意味着对于每个 file你迭代一遍,你认为执行暂停的地方,事实上,Javascript 继续进行下一次迭代。您将无法保证 dbConnection.query 的执行时间回调。如果您使用Promise.all稍作更改即可达到 Array.map您可以实现更可预测的结果并利用“并行”功能Promise.all给出。这是受您的示例启发的伪代码。

    await Promise.all(
files.map((file) => {
const id_cajero = file.split("_")[1];
const params = { Bucket: "*****", Key: file };
const sql = `SELECT id_entidad FROM cajero WHERE id_cajero = '${id_cajero}';`;

return new Promise((resolve, reject) => {
dbConnection.query(sql, async (err, result) => {
if (err) {
return reject(err);
}

const fileExecutedData = await leerarchivos3(
params,
s3,
id_cajero,
result[0].id_entidad
);

fileExecutedData.file = file;

executed.push(fileExecutedData);

return resolve();
});
});
})
);

next(executed);

关于javascript - 函数执行完成之前执行的回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60177099/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com