2017-02-06 3 views
-1

Ich versuche, einen synchronen Prozess in node.js zu entwickeln, und ich habe die async.series Methode implementiert, aber die Art und Weise, die ich implementiert habe, funktioniert nicht wie erwartet. Ich erwarte, dass die zweite Funktion der Reihe funktioniert, nachdem die erste Funktion beendet wurde (einschließlich der Operation der Schleife). Da die s3.getObject eine asynchrone Funktion ist bin ich ein paar verloren wie ich sie richtig umsetzen kann.async - Ausführen von Aktion nach Schleife in Javascript abgeschlossen

Fortsetzung: Ich möchte auf die zweite Funktion nach Abschluss der Schleife und die Funktionen innerhalb der Schleife gehen.

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); 
    } 

}); 

Log von dem, was passiert ist:

pegou usuarios do perfil... 

first function series... 

loop jsonUsuariosPerfil... [email protected] 

second function series.. 

Vielen Dank für alle Hilfe.

+2

Und Sie sind nicht nur asynchronen Betrieb zu tun Verkettung verspricht, weil ...? –

+0

Hallo Jared, ich bin ein Anfänger Entwickler in Javascript/node.js und ich wusste nicht, was ist das .. Ich werde mehr über die "Versprechen" suchen, vielen Dank! –

+1

Warum wurde dieses Tag async-abgewartet? – Bergi

Antwort

-1

paar Punkte zu kümmern:

  1. Immer Rückruf anrufen, sowohl im Erfolgsfall als auch Fehler.
  2. Erstes Argument der Rückruf fehler (In den meisten Fällen)
  3. Verwenden async.each oder async.map auf jedes Element einer Sammlung

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(); 
    }); 
} 
+0

Grund für den Downvote, bitte. – Sangharsh

+0

Obwohl ich nicht der DV bin, würde ich es vermuten, weil das OP möchte, dass die asynchronen Ops nacheinander ausgeführt werden, und Sie führen sie immer noch gleichzeitig mit 'async.each' aus. –

Verwandte Themen