async - 在javascript中完成循环后执行操作

时间:2017-02-06 17:35:39

标签: javascript node.js async.js

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

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:-1)

需要注意的几点:

  1. 在成功和错误的情况下,始终呼叫回叫。
  2. 回调的第一个参数是错误(在大多数情况下)
  3. 使用async.eachasync.map对集合的每个元素执行异步操作
  4. 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();
      });
    }