2017-08-29 2 views
2

Ich habe folgenden Code für das Hochladen von Dateien auf dem Server asynchron mit Hilfe von Versprechen geschrieben. Und wir kennen dieses Versprechen. Alles wird scheitern, sobald jemand von den Versprechen versagt. Also möchte ich wissen, welches Versprechen tatsächlich fehlgeschlagen ist und in meinem Fall der Name der Datei, für die das Versprechen fehlgeschlagen ist. Ich versuche console.log (e1), aber es gibt mir keine Informationen über fehlgeschlagene Versprechen. Kann mir bitte jemand helfen?Wie man das Versprechen von promise.all abgelehnt bekommt?

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

UploadFilesOnServer Code ist:

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

, dass eine Lösung sein könnte: http://bluebirdjs.com/docs/ api/reflect.html – frulo

+0

Ich glaube nicht, dass Sie 'JSON.parse' die' e1' – Bergi

+0

Yeah wollen. Bearbeitet. @Bergi Aber ich kann immer noch nicht die erforderlichen Informationen erhalten. – HamidArrivy

Antwort

3

Sie diese Informationen an das Fehlerobjekt hinzufügen:

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

Dies wird mir das erste abgelehnte Versprechen geben. Was, wenn ich alle Versprechen von Promise.all abgelehnt bekommen möchte? Wie können wir Versprechen in diesem Fall ändern? – HamidArrivy

+0

Dann können wir keine Ablehnungen verwenden, müssen aber [Warten Sie, bis alle ES6-Versprechungen abgeschlossen sind] (https://stackoverflow.com/questions/31424561/wait-until-all-es6-versprechen-komplette-jede-verweigerte-versprechen-) – Bergi

+0

können Sie mir bitte sagen, wie kann ich es in meinem Beispiel codieren? – HamidArrivy

Verwandte Themen