我有一个API请求列表,只有当所有请求都完成时,我才会返回答案。我为此使用了Promise.all,但似乎当时的promise.all在他想等待的promise之前被触发。 我认为这是因为在发帖请求中有一个get请求。我该如何进行这项工作?
这是一个React-redux项目。
if (devices) {
const APIArray = [];
devices.forEach(device => {
const data = {
id: device.id,
};
dispatch({ type: EDIT_DEVICE, payload: data });
APIArray.push(
axios
.post('/deploy/update', data)
.then(res => {
ApiUtils.get(`/deploy/device?deviceId=${data.id}`).then(response => {
console.log('1');
dispatch({ type: EDIT_DEVICE_SUCCESS, payload: { device: response.data } });
});
})
.catch(error => {
dispatch({ type: EDIT_DEVICE_FAIL, payload: { device: data, error: error } });
})
);
});
return Promise.all(APIArray)
.then(res => {
console.log('2');
dispatch({ type: UPDATE_DEVICES_SUCCESS, payload: res });
return res;
})
.catch(err => {
return err
);
}
expected: console.log('1')
console.log('1')
console.log('2')
actual: console.log('2')
console.log('1')
console.log('1')
答案 0 :(得分:1)
这是因为承诺是Axios.post返回的承诺,但是一旦收到发布结果,您就会执行另一个承诺。
APIArray.push(
axios
.post('/deploy/update', data)
.then(res => {
return ApiUtils.get(`/deploy/device?deviceId=${data.id}`).then(response => {
console.log('1');
dispatch({ type: EDIT_DEVICE_SUCCESS, payload: { device: response.data } });
});
})
.catch(error => {
dispatch({ type: EDIT_DEVICE_FAIL, payload: { device: data, error: error } });
})
);
请参见,然后添加了return语句。这样,ApiUtils.get承诺将传递到承诺链。
答案 1 :(得分:1)
您必须将内在的诺言还给外链:
return ApiUtils.get(`/deploy/device?deviceId=${data.id}`).then(/*...*/);
通过返回它,外部.then
返回的承诺将与此相关。
答案 2 :(得分:0)
您应该更改
.then(res => {
ApiUtils.get(`/deploy/device?deviceId=${data.id}`).then(...);
})
通过
.then(res => {
return ApiUtils.get(`/deploy/device?deviceId=${data.id}`).then(...);
})
// or without brackets
.then(res => ApiUtils.get(`/deploy/device?deviceId=${data.id}`).then(...))