我一直在尝试找出为这个函数写一个promise的正确方法。我有一个异步函数,它向服务器发出HTTP请求以检索响应“documents_fileUploader”。我通过响应中每个项目的" url“进行映射,每个url都会进入一个函数,该函数发出另一个HTTP请求,然后设置状态。我只想在"documents_fileUploader()“函数内的所有操作完成后才触发"upload()”函数。我试着在没有承诺的情况下这样做,它直接转到了我的"upload()“函数,因为请求仍在等待。对如何做这件事有什么建议吗?
documents_fileUploader(formData).then(resp => {
resp.data.items.map(url => {
const key = url.split("/")[4];
this.setState({
urls: [...this.state.urls, url],
keys: [...this.state.keys, key]
});
this.getFileObject(key);
})
}).then(() => {
this.upload();
})
getFileObject = file => {
file_view(file).then(resp => {
this.setState({
mimeTypes: [...this.state.mimeTypes, resp.data.item.headers.contentType]
})
}).catch(err => {
console.log(err);
})
}
发布于 2018-09-27 04:37:38
对于您的主要问题,您可以使用method.
.map
调用返回的每个promise。为了使其正常工作,getFileObject
函数必须返回它创建的promise。因此,结合这两个更改,您的代码片段可能如下所示:
documents_fileUploader(formData).then(resp => {
return Promise.all(resp.data.items.map(url => { // Wrap in Promise.all and return it
const key = url.split("/")[4];
this.setState({
urls: [...this.state.urls, url],
keys: [...this.state.keys, key]
});
return this.getFileObject(key); // Make sure to return this promise as well.
}));
}).then(() => {
// Now this won't happen until every `getFileObject` promise has resolved...
this.upload();
})
getFileObject = file => {
return file_view(file).then(resp => { // And return the promise here.
this.setState({
mimeTypes: [...this.state.mimeTypes, resp.data.item.headers.contentType]
})
}).catch(err => {
console.log(err);
})
}
https://stackoverflow.com/questions/52525594
复制相似问题