1
votes

attendre la promesse en boucle

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.


6 commentaires

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 ..


3 Réponses :


0
votes

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);
    });
};


0 commentaires

2
votes

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)


0 commentaires

0
votes

** 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)


0 commentaires