J'ai cette fonction:
'uploading' -> 'uploading' -> 'success' -> 'success'
J'appelle la fonction ci-dessus ici:
'uploading' -> 'success' -> 'uploading' ...
La sortie devrait être
XXX
Mais c'est en fait
const dirents = await fs.readdirSync(path, {withFileTypes:true}); await Promise.all(dirents.map(async (dirent) => { await upload(example).then((response) => { console.log('success'); }, (err) => { console.log(err); }); });
J'ai aussi essayé ( for ... of
) mais ça ne marche pas ' t travaille pour moi non plus.
3 Réponses :
Voici un exemple moderne utilisant reduction
avec async / await
(que vous pouvez exécuter ici )
let userIDs = [1,2,3]; userIDs.reduce( async (previousPromise, nextID) => { await previousPromise; return upload(nextID).then((val) => { console.log("success", val); }) }, Promise.resolve()); const upload = (id) => { console.log('uploading...', id); return new Promise(function (resolve, reject) { resolve(id); }); };
Pour les promesses séquentielles, l'utilisation d'une simple boucle dans une fonction async
est très claire et lisible:
let userIDs = [1, 2, 3]; async function uploadIDS(ids) { for (let id of ids) { let res = await upload(id) console.log("Success:", res) } } const upload = (example) => { console.log('uploading...'); return new Promise(function(resolve, reject) { resolve(example) }); }; uploadIDS(userIDs)
** vous pouvez le faire aussi, avec la fonction Recursion **
//const dirents = await fs.readdirSync(path, {withFileTypes:true}); const dirents = [1,2,3] const upload = (example) => { console.log('uploading...'); return new Promise(function (resolve, reject) { resolve(example) }); }; function callUpload(dirent, length, count) { if(count >= dirents.length){ return; } upload(dirent).then(() => { count += 1; console.log("success") callUpload(dirents[count], dirents.length, count) }) } callUpload(dirents[0], dirents.length, 0)
Promise.all n'appelle pas séquentiellement. Il attend juste que tout soit résolu. Ils commencent en même temps
@SebastianSpeitel pourquoi ne fonctionne-t-il pas avec (pour ... de) ni?
Vous n'avez probablement pas attendu le téléchargement précédent avant de commencer le suivant
@SebastianSpeitel J'ai utilisé le même code que ci-dessus, juste avec (pour ... sur)
Il existe des possibilités infinies pour convertir cela en
attendre le téléchargement (exemple) .then (
c'est du code illogique ..