Javascript 承诺。在承诺之前,一切都完成了;他靠什么

Javascript 承诺。在承诺之前,一切都完成了;他靠什么,javascript,promise,Javascript,Promise,我有一个API请求列表,只有当所有请求都完成时,我才会返回一个答案。我用这个承诺。所有的一切都是为了那个,但这似乎是当时的承诺。所有的一切都是在他应该等待的承诺之前被触发的。 我想这是因为我在post请求中有一个get请求。我怎样才能做到这一点 这是一个react redux项目 if (devices) { const APIArray = []; devices.forEach(device => { const data = {

我有一个API请求列表,只有当所有请求都完成时,我才会返回一个答案。我用这个承诺。所有的一切都是为了那个,但这似乎是当时的承诺。所有的一切都是在他应该等待的承诺之前被触发的。 我想这是因为我在post请求中有一个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')

这是因为这些承诺是由Axios.post返回的,但一旦您收到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 } });
            })
    );

在then中,我添加了一个return语句。通过这种方式,ApiUtils.get承诺被传递到承诺链。

这是因为承诺是由Axios.post返回的承诺,但一旦收到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 } });
            })
    );

在then中,我添加了一个return语句。这样,ApiUtils.get promise就会传递到promise链。

您必须将内部承诺返回到外部链:

 return ApiUtils.get(`/deploy/device?deviceId=${data.id}`).then(/*...*/);

通过返回,外部
返回的承诺将被链接。

您必须将内部承诺返回到外部链:

 return ApiUtils.get(`/deploy/device?deviceId=${data.id}`).then(/*...*/);
通过返回它,外部
返回的承诺将被链接。

您应该更改

.then(res => {
   ApiUtils.get(`/deploy/device?deviceId=${data.id}`).then(...);
})

你应该改变

.then(res => {
   ApiUtils.get(`/deploy/device?deviceId=${data.id}`).then(...);
})