【问题标题】:async - Execute action after loop completed in javascriptasync - 在javascript中完成循环后执行操作
【发布时间】:2023-04-11 04:00:02
【问题描述】:

我正在尝试在 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..

非常感谢大家的帮助。

【问题讨论】:

  • 你不只是因为...链接承诺?
  • 嗨 Jared,我是 javascript/node.js 的初学者开发人员,我不知道这是什么.. 我会搜索更多关于“承诺”的信息,非常感谢!
  • 为什么这被标记为 async-await?
  • @pedro.olimpio 没问题,我们在某个时候都是初学者:我直到 30 多岁才开始专业编程。但是,您确实需要学习的一件事是如何弄清楚问题的本质:在这种情况下,当您尝试了解如何构建异步代码时,请执行可行的最简单的异步操作。直接跳入并尝试解决实际问题很诱人,但请尝试训练自己首先制作一个最小的示例。
  • @JaredSmith 谢谢你的建议,我确实设法用最简单的实现解决了这个问题,并且没有必要使用async pack。再次感谢您!

标签: javascript node.js async.js


【解决方案1】:

需要注意的几点:

  1. 在成功和错误的情况下始终调用回调。
  2. 回调的第一个参数是错误(大多数情况下)
  3. 使用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();
  });
}

【讨论】:

  • 虽然我不是 DV,但我猜是因为 OP 希望异步操作连续运行,而您仍在与async.each 同时运行它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多