我正在尝试在node.js中开发一个同步进程,并且我已经实现了async.series
方法,但是我实现的方式并没有像我预期的那样工作。我希望在第一个函数终止(包括循环操作)之后,该系列的第二个函数可以工作。由于s3.getObject
是一个异步函数,我失去了一些如何正确实现它。
恢复:我想在完成循环和循环内的函数后转到第二个函数。
async.series([
function(cback) {
console.log("first function series...");
for (var i = 0; i < jsonUsuariosPerfil.users.length; i++) {
var usuario = jsonUsuariosPerfil.users[i];
var paramsUsers = {
Bucket: 's3.....br/.../users/' + usuario.user,
Key: 'profiles',
};
console.log("loop jsonUsuariosPerfil... " + usuario.user);
s3.getObject(paramsUsers, function(err, data) {
if (err) {
console.log("Error: " + err);
const message = "Error getting user -> " + err;
console.log(message);
callback(message);
} else {
var jsonPerfisUsuario = JSON.parse(data.Body);
var removido = false;
console.log("found object..." + JSON.stringify(data.Body))
for (var i = 0; i < jsonPerfisUsuario.profiles.length; i++) {
var perfil = jsonPerfisUsuario.profiles[i];
if (perfil.profile == id_grupo) {
jsonPerfisUsuario.profiles.splice(i, 1);
removido = true;
break;
}
}
if (removido) {
var paramsPut = {
Bucket: 's3.....br/.../users/' + usuario.user,
Key: 'profiles',
Body: JSON.stringify(jsonPerfisUsuario)
};
console.log("removido, salvando profiles");
s3.putObject(paramsPut, function(err2, data2) {
if (err2) {
console.log("error putting the file:" + err2);
var erro = {
status: "ERROR_SAVING_FILE"
};
generalCallback(null, erro);
} else {
console.log("salvo arquivo dos profiles do usuario");
}
});
}
}
});
}
cback();
},
function(cback) {
console.log("second function series...");
removerGrupoCompleto();
}
], function(err) {
if (err) {
var error = {
status: "ERROR"
};
generalCallback(null, error);
}
});
记录发生的事情:
pegou usuarios do perfil...
first function series...
loop jsonUsuariosPerfil... pedro@.....com.br
second function series..
非常感谢你的帮助。
答案 0 :(得分:-1)
需要注意的几点:
async.each
或async.map
对集合的每个元素执行异步操作async.each(jsonUsuariosPerfil.users, processUser, function(err) {
if (err) {
var error = {
status: "ERROR"
};
return generalCallback(error);
} else {
return generalCallback(null); // Always call callback and using with return is a good practice
}
});
function processUser(usuario, callback) {
var paramsUsers = {
Bucket: 's3.....br/.../users/' + usuario.user,
Key: 'profiles',
};
s3.getObject(paramsUsers, function(err, data) {
if (err) {
console.log("Error: " + err);
const message = "Error getting user -> " + err;
console.log(message);
return callback(err);
}
var jsonPerfisUsuario = JSON.parse(data.Body);
var removido = false;
console.log("found object..." + JSON.stringify(data.Body))
for (var i = 0; i < jsonPerfisUsuario.profiles.length; i++) {
var perfil = jsonPerfisUsuario.profiles[i];
if (perfil.profile == id_grupo) {
jsonPerfisUsuario.profiles.splice(i, 1);
removido = true;
break;
}
}
if (removido) {
return removido(usuario, jsonPerfisUsuario, callback);
}
return callback();
});
}
function removido(usuario, jsonPerfisUsuario, callback) {
var paramsPut = {
Bucket: 's3.....br/.../users/' + usuario.user,
Key: 'profiles',
Body: JSON.stringify(jsonPerfisUsuario)
};
console.log("removido, salvando profiles");
s3.putObject(paramsPut, function(err2, data2) {
if (err2) {
console.log("error putting the file:" + err2);
return callback(err2);
}
return callback();
});
}