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?
Eu não acho que isso garante a ordem de chamar logger.log (res);
Na verdade, sim. Essa declaração é executada antes da resolve
chamada.
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 while
funçã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 while
loop (com uma variável de fechamento), mas um for
loop:
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.
deixe-me dizer algumas palavras