2017-08-29 1 views
2

J'ai écrit le code suivant pour télécharger des fichiers sur le serveur de manière asynchrone à l'aide de promesses. Et nous savons que cette promesse. Tout échouera une fois que quelqu'un des promesses échouera. Donc, je veux savoir quelle promesse est réellement échouée et dans mon cas le nom du fichier pour lequel la promesse a échoué. J'essaye console.log (e1) mais il ne me donne pas l'information au sujet de la promesse échouée. Quelqu'un peut-il m'aider s'il vous plaît?Comment obtenir la promesse rejetée de promise.all?

uploadFilesAndSendStatus(stateType, notes, estimate, visibleToCustomer = null) 
    { 
    let filesPromise = Promise.resolve([]); 

    const promises = this.state.files_to_upload.map((file) => { 
     return this.uploadFilesOnServer(file); 
    }); 

    filesPromise = Promise.all(promises).then((results) => { 

     return [].concat(...results); 
    }).catch((e1) =>{ 
     console.log(e1); 
     this.setState({ 
     serverActionPending: false, 
     serverActionComplete: false, 
     file_upload_try_again: true, 
     }); 
    }); 
} 

code UploadFilesOnServer est:

uploadFilesOnServer(file) { 
    let files=[]; 
    let file_id=''; 
    const image=file; 
    const promise = getAttachmentUploadURL(this.props.task.id) 
    .then((imageUrlResponse) => { 
     const data = new FormData(); 

     data.append('file-0', image); 

     const { upload_url } = JSON.parse(imageUrlResponse); 

     return uploadAttachment(upload_url, data); 
    }) 
    .then ((updateImageResponse) => { 
     file_id= JSON.parse(updateImageResponse); 

     files.push(file_id); 

     return files; 
    }); 

    return promise; 
    } 
+0

pourrait-il être une solution: http://bluebirdjs.com/docs/ api/reflect.html – frulo

+0

Je ne pense pas que vous voulez 'JSON.parse' le' e1' – Bergi

+0

Ouais. Édité. @Bergi Mais je ne peux toujours pas obtenir les informations requises. – HamidArrivy

Répondre

3

Vous pouvez ajouter cette information à l'objet d'erreur:

const promises = this.state.files_to_upload.map((file, i) => { 
    return this.uploadFilesOnServer(file).catch(err => { 
    const e = new Error("upload failed"); 
    e.index = i; 
    e.filename = file 
    throw e; 
    }); 
}); 

const filesPromise = Promise.all(promises).then(res => [].concat(...res)).catch(e1 => { 
    console.log(e1); 
    … 
}); 
+0

Cela me donnera la première promesse rejetée. Que se passe-t-il si je veux obtenir toute promesse rejetée de promise.all? Comment pouvons-nous modifier promesse.tout dans ce cas? – HamidArrivy

+0

Ensuite, nous ne pouvons pas utiliser les rejets, mais nous devons attendre que toutes les promesses ES6 soient terminées. (Https://stackoverflow.com/questions/31424561/wait-until-all-es6-promises-complete-even-rejected-promises) – Bergi

+0

pouvez-vous s'il vous plaît dites-moi comment puis-je le code dans mon exemple? – HamidArrivy