Promesse.tous en JavaScript: Comment obtenir de régler la valeur de toutes les promesses?
J'ai écrit ce qui suit node.js fichier:
var csv = require('csv-parser');
var fs = require('fs')
var Promise = require('bluebird');
var filename = "devices.csv";
var devices;
Promise.all(read_csv_file("devices.csv"), read_csv_file("bugs.csv")).then(function(result) {
console.log(result);
});
function read_csv_file(filename) {
return new Promise(function (resolve, reject) {
var result = []
fs.createReadStream(filename)
.pipe(csv())
.on('data', function (data) {
result.push(data)
}).on('end', function () {
resolve(result);
});
})
}
Comme vous pouvez le voir, j'utilise Promise.all
afin d'attendre les deux opérations de lecture des fichiers csv. Je ne comprends pas pourquoi mais quand je lance le code de la ligne 'console.log(result)'
n'est pas engagé.
Ma deuxième question est que je veux que la fonction de rappel de Promise.all.then()
accepte deux variables différentes, alors que chacun d'entre eux est le résultat de la promesse.
OriginalL'auteur CrazySynthax | 2016-11-16
Vous devez vous connecter pour publier un commentaire.
Première question
Promise.all
prend un tableau de promessesChangement:
pour (ajouter
[]
autour d'arguments)Deuxième question
La
Promise.all
se résout avec un tableau de résultats pour chacun des promesses que vous avez passé sur elle.Cela signifie que vous pouvez extraire les résultats dans des variables comme:
Vous pouvez utiliser ES6+ déstructuration pour simplifier le code:
Pas de problème, consulter mon edit
OriginalL'auteur nem035
Réponse à votre deuxième question:
Si vous voulez le
then
de rappel pour accepter deux différents arguemnts, alors vous pouvez utiliser Bluebird et sesspread
méthode. Voir:Au lieu de
.then(function (array) { ... })
et d'avoir accès àarray[0]
etarray[1]
à l'intérieur de votrethen
gestionnaire, vous serez en mesure d'utiliserspread(function (value1, value2) { ... })
et ont à la fois des variables nommées comme vous le souhaitez.C'est une caractéristique de Bluebird, il n'est pas possible avec la plaine
Promise
.Vous utilisez Bluebird juste comme la Promesse, par exemple:
Bien sûr, vous n'avez pas de nom, il
P
mais tout ce que vous voulez.Pour plus d'exemples, voir le Bluebird Cheatsheets.
Pas de. Un standard Promesse a seulement
then
qui obtient un tableau de Promesse.tous les.et si j'utilise le "spread", comment est la gestion des erreurs commises? Je n'ai pas vu une clause catch dans le lien.
Vous utilisez
.spread(...).catch(...)
comme vous le feriez.then(...).catch(...)
.Voir le Bluebird triche
OriginalL'auteur rsp