2017-02-06 12 views
-1

私はnode.jsで同期プロセスを開発しようとしていますが、async.seriesメソッドを実装しましたが、実装した方法が期待通りに機能していません。私は、最初の関数が終了した後で、一連の2番目の関数が動作することを期待しています(ループの動作を含む)。 s3.getObjectは非同期関数なので、どうやって正しく実装できますか?async - javascriptでループ完了後にアクションを実行

再開:ループとループ内の関数を完了した後、2番目の関数に移動します。何が起こっているかの

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... [email protected] 

second function series.. 

おかげですべての助けのためにたくさん。世話をするためのポイントの

+2

の各要素に対して非同期操作を行うには

  • 使用async.eachまたはasync.map(ほとんどの場合)エラーで、あなただけではありませんチェーン化の約束は...? –

  • +0

    こんにちはジャレッド、私はjavascript/node.jsの初心者の開発者で、これは何かわかりませんでした。私は "約束"について詳しく調べています。ありがとうございます! –

    +1

    なぜこのタグは非同期ですか? – Bergi

    答えて

    -1

    カップル:

    1. は必ず成功した場合にだけでなく、エラーの両方、コールバックを呼び出します。コールバックの
    2. 最初の引数は、コレクション

    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

    downvoteの理由は、してください。 – Sangharsh

    +0

    私はDVではありませんが、OPは非同期オペレーションを連続して実行することを望んでおり、まだasync.eachと同時に実行しているので、私はそのオペランドを推測します。 –

    関連する問題