Angularjs: Combinando promessas com funções síncronas

Oct 25 2020

Em AngularJS - misturando HTTP e promessas personalizadas com recursão, eu postei uma pergunta sobre como consertar um trecho de código que envolvia o retorno de promessas e foi apontado para mim que eu estava criando promessas de invólucro desnecessariamente. Seguindo as sugestões, acabei com um código muito mais limpo. Eu tenho uma pergunta de acompanhamento: em uma situação como a abaixo (exemplo composto), em que preciso misturar código de promessa com código de não promessa, não vejo outra opção a não ser construir minha própria promessa usando $q.defer()e retornando d.promiseno final . Existe uma maneira melhor / recomendada? Posso misturar minha promessa personalizada com funções que retornam sua própria promessa?

function my_func(use_promise) {
  var d = $q.defer();

  if (!use_promise) {
     x = do_a_sync_function_that_takes_time();
     d.resolve(x)
     return d.promise; 
  } else {
     return do_a_promise_function_that_takes_time()
     .then (function(data) {
        return (data); // this gets promisified as we are in .then
     })
     .catch(function (err) {return "Error ";});
  }
  return d.promise;
}

Respostas

1 georgeawg Oct 25 2020 at 04:23

Para converter um valor síncrono em uma promessa, basta usar $q.whenou $q.resolve:

function my_func(use_promise) {
  ̶v̶a̶r̶ ̶d̶ ̶=̶ ̶$̶q̶.̶d̶e̶f̶e̶r̶(̶)̶;̶ if (!use_promise) { var x = do_a_sync_function_that_takes_time(); ̶d̶.̶r̶e̶s̶o̶l̶v̶e̶(̶x̶)̶ return $q.when(x); 
  } else {
     return do_a_promise_function_that_takes_time()
     .then (function(data) {
        return (data); // this gets promisified as we are in .then
     })
     .catch(function (err) {return "Error ";});
  }
  ̶r̶e̶t̶u̶r̶n̶ ̶d̶.̶p̶r̶o̶m̶i̶s̶e̶;̶
}

Para mais informações, veja

  • $qReferência da API de serviço AngularJS -$q.when