2017-10-20 7 views
4

Ce que je fais actuellement de faire des boucles à l'intérieur d'une promesse est comme suit:Est-il possible d'utiliser map/filter/reduce dans une promesse en retournant le résultat avec Promise.resolve?

asyncFunc() 
.then(() => { 
    return new Promise((resolve) => { 
     for (let i = 0; i < length; i++) { 
     // do something 
      if (j == length - 1) { 
       return resolve(result); 
      } 
     } 
    }) 
.then((result) => { 
    console.log("This shows after the loop above is done"); 
    console.log(result); 
}); 

Je pense à remplacer ce d'une manière plus concise en utilisant la carte/filtre/réduire en remplaçant à la place de la boucle avec ceci:

return new Promise((resolve) => { 
    let result = some_list.filter((item) => { 
     return item.count > 2; 
    }) 
    return resolve(result); 
}) 

Est-ce faisable? Ou devrais-je m'en tenir à utiliser la boucle for à la place?

J'ai récemment lu des articles sur le mélange de code synchrone et de code asynchrone, mais je n'ai pas trouvé de solution à ce qu'il faut faire en les mélangeant avec des promesses.

+1

oui c'est possible.Aussi, vous pouvez vérifier consolant la sortie de l'affaire. – brk

Répondre

3

Oui, c'est un code parfaitement raisonnable. Vous pouvez même écrire comme:

return new Promise((resolve) => { 
    resolve(some_list.filter((item) => { 
     return item.count > 2; 
    })); 
}); 
+0

ou non promisify une opération synchrone à l'intérieur de '.then' en premier lieu (si vous voulez faire les choses correctement, c'est) –

1

Vous promisifying code synchrone dans un .alors ... il n'y a vraiment pas besoin de ça du tout, étant donné que la valeur retournée par un rappel .then (votre code) est toujours garantie une promesse

ou, autrement dit, la valeur retournée dans .then est déjà transformé en une promesse, créant ainsi une promesse pour une valeur générée par le code synchrone est redondant

donc: votre code est plus correctement écrit

asyncFunc() 
.then(() => some_list.filter(item => item.count > 2)) 
}).then((result) => { 
    console.log("This shows after the loop above is done"); 
    console.log(result); 
}); 
+0

Oh ok! Donc, si j'utilise map/filter/reduce, je peux le faire, mais si j'utilise une boucle for, j'aurais besoin d'utiliser Promise.resolve, n'est-ce pas? Mais qu'en est-il si ce qui se trouve dans le 'then' est multi-ligne? Par exemple peut-être deux appels à filtrer ou autre chose. Puis-je toujours garantir que la dernière ligne, en supposant que l'exemple 'filter' que vous avez montré est la dernière ligne, serait celle retournée à la suivante' then'? –