Do RETURN when the function is finished

0

How do I return to alert("SUCESSO") as soon as I drop into return alert("ELSE"); ?

sincronizar: function () {
    sincronizarCliente().then(function () {
        alert("SUCESSO");
    }, function () {
        alert("SEM SUCESSO");
    });
},
sincronizarCliente: function (timestamp) {
        $http.get("minha_API").success(function (res) {
            var cliente = res;
            insere(0);
            function insere(cod) {
                if (cod < cliente.length) {
                    $cordovaSQLite.execute(db, "SELECT cdcliente FROM cliente WHERE cdcliente =" + cliente[cod].Cdcliente)
                    .then(function (res) {
                        if (res.rows.length == 0) {
                            $cordovaSQLite.execute(db, "INSERT INTO cliente " + clienteInsert, [cliente[cod].Cdcliente, cliente[cod].Nmcliente])
                            .then(function () {
                                alert("INSERT CLIENTE");
                                insere(++cod);
                            }), function (err) {
                                alert("ERRO: INSERT CLIENTE");
                            }
                        } else {
                            $cordovaSQLite.execute(db, "UPDATE cliente SET " + clienteUpdate + " WHERE cdcliente =" + cliente[cod].Cdcliente, [cliente[cod].Cdcliente, cliente[cod].Nmcliente])
                            .then(function () {
                                alert("UPDATE CLIENTE");
                                insere(++cod);
                            }), function (err) {
                                alert("ERRO: UPDATE CLIENTE");
                            }
                        }
                    }), function (err) {
                        alert("CLIENTE NÃO ENCONTRADO");
                    }
                } else {
                    return alert("ELSE");
                }
            }
        }).error(function (err) {
            alert("ERRO: sincronizarCliente");
        });
    },
    
asked by anonymous 12.04.2016 / 15:06

2 answers

0

I have studied how to use promises, but what really helped me was this answer: How to actually learn how to use promises in javascript?

It looks something like this:

function f() {
function a() { return get('/le_valor/'); }
function b(x) { return x * x; }
function c(y) { return post('/resultado/', {valor:y}); }
function d() { console.log("pronto"); }

return a().then(b).then(c).then(d);

}

    
14.04.2016 / 13:17
2

If you are working with Promises, then your CustomerSync should have the data already processed or a new Promise returned.

//$q = meu serviço;
sincronizarCliente: function (timestamp) {
  return $http.get("minha_API").then(function (res) {
    var clientes = res;
    var retorno = {};
    retorno.Clientes = [];
    function insere() {
      var cliente = clientes.shift();
      if (cliente) {
        return $cordovaSQLite.execute(db, "SELECT cdcliente FROM cliente WHERE cdcliente = ?", [cliente.Cdcliente]).then(function (res) {
          if (res.rows.length == 0) {
            return $cordovaSQLite.execute(db, "INSERT INTO cliente(cdcliente, nmcliente) VALUES (?, ?)", [cliente.Cdcliente, cliente.Nmcliente]).then(function () {
              retorno.Clientes.push({ cliente: cliente.Cdcliente, Acao: "INSERT", Sucesso: true });
              return insere();
            }, function (err) {
              retorno.Clientes.push({ cliente: cliente.Cdcliente, Acao: "INSERT", Sucesso: false });
              return insere();
            });
          } else {
            return $cordovaSQLite.execute(db, "UPDATE cliente SET nmcliente = ? WHERE cdcliente = ?", [cliente.Nmcliente, cliente.Cdcliente]).then(function () {
              retorno.Clientes.push({ cliente: cliente.Cdcliente, Acao: "UPDATE", Sucesso: true });
              return insere();
            }, function (err) {
              retorno.Clientes.push({ cliente: cliente.Cdcliente, Acao: "UPDATE", Sucesso: false });
              return insere();
            });
          }
        }, function (err) {
          retorno.Clientes.push({ cliente: cliente.Cdcliente, Acao: "SELECT", Sucesso: false });
          return insere();
        });     
      }
      else
      {     
        var hasErros = retorno.Clientes.some(function (cli) { return !cli.Sucesso });
        if (hasErros) {
            retorno.Mensagem = "Erro ao processar um ou mais clientes"; 
            return $q.reject(retorno);
        } else {
            retorno.Mensagem = "Todos os clientes processados com sucesso"; 
            return retorno;         
        }
      }
    }
    return insere();
  }, function (err) {
    retorno.Mensagem = "Error ao carregar à API";
    return $q.reject(retorno);
  });
}

then you can call this method as follows:

sincronizar: function () {
    sincronizarCliente().then(function (retorno) {
        console.log(retorno.Clientes);
        alert(retorno.Mensagem);
    }, function (retorno) {
        console.log(retorno.Clientes);
        alert(retorno.Mensagem);
    });
}

But in one thing I agree with @bigown, the method below would be much simpler if I implemented a callback function instead of using Promise , I'm still lost in the middle of so many return s

    
12.04.2016 / 17:03