2017-02-06 11 views
-1

Я пытаюсь разработать синхронный процесс в node.js, и я внедрил метод async.series, но способ, который я реализовал, не работает, как я ожидаю. Я ожидаю, что вторая функция серии будет работать после завершения первой функции (включая работу цикла). Поскольку s3.getObject является асинхронной функцией, я немного потерял, как я могу ее реализовать правильно.async - Выполнение действия после цикла завершено в javascript

Возобновление: Я хочу перейти ко второй функции после завершения цикла и функций внутри цикла.

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

И вы не просто обещание цепочки, потому что ...? –

+0

Привет, Джаред, я начинающий разработчик в javascript/node.js, и я не знал, что это такое. Я буду искать больше о «обещаниях», спасибо вам большое! –

+1

Зачем это было отмечено асинхронным ожиданием? – Bergi

ответ

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

Причина для downvote, пожалуйста. – Sangharsh

+0

Хотя я не DV, я бы угадал его, потому что OP хочет, чтобы асинхронные операции запускались подряд, и вы все равно выполняете их одновременно с 'async.each'. –