Maneira correta de escrever loops para promessa.

user2127480:

Como construir corretamente um loop para garantir que a seguinte chamada de promessa e o logger.log (res) encadeado sejam executados de forma síncrona através da iteração? (pássaro azul)

db.getUser(email).then(function(res) { logger.log(res); }); // this is a promise

Tentei da seguinte maneira (método de http://blog.victorquinn.com/javascript-promise- while - loop )

var Promise = require('bluebird');

var promiseWhile = function(condition, action) {
    var resolver = Promise.defer();

    var loop = function() {
        if (!condition()) return resolver.resolve();
        return Promise.cast(action())
            .then(loop)
            .catch(resolver.reject);
    };

    process.nextTick(loop);

    return resolver.promise;
});

var count = 0;
promiseWhile(function() {
    return count < 10;
}, function() {
    return new Promise(function(resolve, reject) {
        db.getUser(email)
          .then(function(res) { 
              logger.log(res); 
              count++;
              resolve();
          });
    }); 
}).then(function() {
    console.log('all done');
}); 

Embora pareça funcionar, mas acho que não garante a ordem de chamar logger.log (res);

Alguma sugestão?

Bergi:

Eu não acho que isso garante a ordem de chamar logger.log (res);

Na verdade, sim. Essa declaração é executada antes da resolvechamada.

Alguma sugestão?

Grande quantidade. O mais importante é o uso do antipadrão de criação de promessa manualmente - basta fazer apenas

promiseWhile(…, function() {
    return db.getUser(email)
             .then(function(res) { 
                 logger.log(res); 
                 count++;
             });
})…

Segundo, essa whilefunção pode ser muito simplificada:

var promiseWhile = Promise.method(function(condition, action) {
    if (!condition()) return;
    return action().then(promiseWhile.bind(null, condition, action));
});

Terceiro, eu não usaria um whileloop (com uma variável de fechamento), mas um forloop:

var promiseFor = Promise.method(function(condition, action, value) {
    if (!condition(value)) return value;
    return action(value).then(promiseFor.bind(null, condition, action));
});

promiseFor(function(count) {
    return count < 10;
}, function(count) {
    return db.getUser(email)
             .then(function(res) { 
                 logger.log(res); 
                 return ++count;
             });
}, 0).then(console.log.bind(console, 'all done'));

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

Maneira correta de escrever testes para React

Maneira correta de escrever a linha no arquivo?

Maneira correta de escrever um loop for aninhado?

Maneira correta de escrever consulta de junção sql para três tabelas

Qual é a maneira correta de escrever funções de endpoint para Mongoose com Express?

Qual é a maneira correta de escrever sinal(es) para receber IPNs do PayPal de 3 modelos diferentes

Maneira correta de escrever vários desserializadores Jackson personalizados para lidar com a herança

Qual é a maneira correta de escrever um teste do Minitest para um método que produz?

Maneira correta de preencher uma matriz a partir de uma promessa

Qual maneira de resolver um valor de uma promessa é a correta?

Promessa dentro da promessa: qual é a maneira correta de retornar uma variável da promessa infantil? (JS)

Maneira correta de descobrir que rejeição uma promessa teve?

Qual é a maneira correta de propagar .catch na promessa?

Melhor maneira de escrever loops for aninhados no Elixir

maneira correta de alterar um AxiosPromise para um Promise regular, evitando o anti-padrão do construtor de promessa

Boa maneira de escrever subconsultas na pg-promessa

Esta é a maneira correta de escrever uma série de ponteiros?

A maneira correta de escrever duas variáveis iguais uma à outra

Maneira correta de escrever a função __repr__ com herança

Qual é a maneira correta de escrever HTML usando Javascript?

Maneira melhor / correta de escrever uma consulta complexa

Qual é a maneira correta de escrever funções encadeadas no Angular?

Esta é a maneira correta de escrever declarações IF em R?

Qual é a maneira correta de escrever vários fechamentos à direita no Swift?

Maneira correta de reescrever `curl ...` para perl

Como executar uma promessa da maneira correta

Qual é a maneira correta de buscar dados de promessa de uma variável?

Maneira pitônica de escrever loops for com instruções if aninhadas

Kotlin: Como escrever loops aninhados de maneira funcional?

TOP lista

  1. 1

    R Shiny: use HTML em funções (como textInput, checkboxGroupInput)

  2. 2

    UITextView não está exibindo texto longo

  3. 3

    Dependência circular de diálogo personalizado

  4. 4

    Acessando relatório de campanhas na AdMob usando a API do Adsense

  5. 5

    Como assinar digitalmente um documento PDF com assinatura e texto visíveis usando Java

  6. 6

    R Folheto. Dados de pontos de grupo em células para resumir muitos pontos de dados

  7. 7

    Setas rotuladas horizontais apontando para uma linha vertical

  8. 8

    O Chromium e o Firefox exibem as cores de maneira diferente e não sei qual deles está fazendo certo

  9. 9

    Definir um clipe em uma trama nascida no mar

  10. 10

    Por que meus intervalos de confiança de 95% da minha regressão multivariada estão sendo plotados como uma linha de loess?

  11. 11

    Como dinamizar um Dataframe do pandas em Python?

  12. 12

    regex para destacar novos caracteres de linha no início e no fim

  13. 13

    Why isn't my C# .Net Core Rest API route finding my method?

  14. 14

    Como obter a entrada de trás de diálogo em treeview pyqt5 python 3

  15. 15

    Tabela CSS: barra de rolagem para a primeira coluna e largura automática para a coluna restante

  16. 16

    How to create dynamic navigation menu select from database using Codeigniter?

  17. 17

    Como recuperar parâmetros de entrada usando C #?

  18. 18

    Changing long, lat values of Polygon coordinates in python

  19. 19

    Livros sobre criptografia do muito básico ao muito avançado

  20. 20

    Método \ "POST \" não permitido no framework Django rest com ações extras & ModelViewset

  21. 21

    Pesquisa classificada, conte números abaixo do valor desejado

quentelabel

Arquivo