Promise.all在它所依赖的承诺之前完成

时间:2019-05-27 13:47:12

标签: javascript promise

我有一个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')

3 个答案:

答案 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(...))