Return when the function is over

Asked

Viewed 426 times

0

How to return to alert("SUCESSO") as soon as you fall 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");
        });
    },

2 answers

2

If you’re working with Promises, then yours sincronizarCliente return the data already processed or a new Promise.

//$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 @Maniero, the method below would be much simpler if you implemented a callback instead of using a Promise, I’m still lost in the midst of so many returns

  • So what are saying this is not the best way to do it, but how would it be then? Which way should I go? Where to start? Thanks @Tobymosque

0


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

It looked 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);

}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.