Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

202
Visualizações
Promesas de bucle angular: la función devuelve un objeto vacío

Estoy tratando de pasar un resultado (matriz) de una promesa a una función que itera sobre este resultado, haciendo una solicitud de obtención para cada elemento y creando un nuevo objeto con los resultados antes de devolverlo. El problema es que el objeto se devuelve antes de que se resuelvan las promesas y lo llenen. ¿Cuál es la forma correcta de devolver un objeto poblado de varias promesas?

 function getPackageDetails(packages) { var detailedPackages = {}; angular.forEach(packages, function(p) { vsmsPackageFactory.getPackage(p.id) .then(function(response) { var subsystem = response.data.packageManifest.subsystem; var partNumber = response.data.packageManifest.resultConfig.partNumber; var packageName = response.data.packageMetaData.packageName; if(detailedPackages[subsystem] === undefined) { detailedPackages[subsystem] = {}; } if(detailedPackages[subsystem][partNumber] === undefined) { detailedPackages[subsystem][partNumber] = {}; } detailedPackages[subsystem][partNumber][packageName] = response.data; }); }); return detailedPackages; // returns before all promises resolved } vsmsCampaignFactory.getCampaignPackages(queryString) .then(function(response) { vm.packageList = getPackageDetails(response.results); });
over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Debería considerar usar $q.all para aquellos casos en los que puede reunir todas las promesas en una sola matriz de promesas y luego pasarlas a $q.all y devolver la promesa resultante. Se asegurará de que está devolviendo data después de que se hayan realizado todas las promesas.

En su código, solo está ejecutando sus llamadas ajax asíncronas sin preocuparse de si se completaron o no. Y justo después de eso, está devolviendo datos detailedPackages de paquetes. Pero obviamente va a estar vacío.

Código

 function getPackageDetails(packages) { var detailedPackages = {}; var promises = []; //promise array angular.forEach(packages, function(p) { var promise = vsmsPackageFactory.getPackage(p.id) .then(function(response) { var subsystem = response.data.packageManifest.subsystem; var partNumber = response.data.packageManifest.resultConfig.partNumber; var packageName = response.data.packageMetaData.packageName; if(detailedPackages[subsystem] === undefined) { detailedPackages[subsystem] = {}; } if(detailedPackages[subsystem][partNumber] === undefined) { detailedPackages[subsystem][partNumber] = {}; } detailedPackages[subsystem][partNumber][packageName] = response.data; }); promises.push(promise); }); return $q.all(promises).then(function(){ return detailedPackages; // returned data after all promises are done }); }
over 4 years ago · Santiago Trujillo Relatório

0

esto podría lograrse usando prometer todo, aquí .

 var promises = []; promises.push(new Promise(function (resolve, reject) { vsmsPackageFactory.getPackage(p.id) .then(function(response) { ... resolve('If you want to return something') }); }); //After the loop it's finished you execute your promises Promise.all(promises).then(function (values) { ... perform more code });
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda