2017-08-29 630 views
2

我已經寫了下面的代碼,用於在承諾的幫助下異步上傳服務器上的文件。而且我們知道promise.all將失敗,一旦任何承諾失敗。所以,我想知道哪個承諾實際上失敗了,在我的案例中,承諾失敗的文件名稱。我正在嘗試console.log(e1),但它沒有給我關於失敗的承諾的信息。任何人都可以幫我做嗎?如何從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, 
     }); 
    }); 
} 

UploadFilesOnServer代碼:

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

會是一個解決方案:http://bluebirdjs.com/docs/ api/reflect.html – frulo

+0

我不認爲你想'JSON.parse'的'e1' – Bergi

+0

是的。編輯。 @Bergi 但我仍然無法獲得所需的信息。 – HamidArrivy

回答

3

您可以在信息添加到錯誤對象:

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

這會給我第一個被拒絕的承諾。如果我想從promise.all獲得所有被拒絕的承諾怎麼辦?我們該如何改變promise.all在這種情況下? – HamidArrivy

+0

然後我們不能使用拒絕,但必須[等到所有ES6承諾完成](https://stackoverflow.com/questions/31424561/wait-until-all-es6-promises-complete-even-rejected-promises) – Bergi

+0

你能告訴我如何在我的例子中編碼嗎? – HamidArrivy