Promise.all закончен до обещаний, на которые он полагается - PullRequest
0 голосов
/ 27 мая 2019

У меня есть список запросов API, и только когда все они будут выполнены, я верну ответ.Я использовал th Promise.all для этого, но похоже, что тогда обещание. Все запускается перед обещаниями, которые он предполагает ждать.Я подумал, что это происходит, потому что у меня есть запрос get внутри почтового запроса.Как я могу сделать эту работу?

Это реактивно-избыточный проект.

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 ]

1 голос
/ 27 мая 2019

Вы должны вернуть внутреннее обещание внешней цепи:

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

Возвращая его, обещание, возвращаемое внешним .then, будет приковано к этому.

1 голос
/ 27 мая 2019

Это потому, что обещания возвращаются 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 } });
            })
    );

Смотрите, тогда я добавилответное заявлениеТаким образом, обещание ApiUtils.get передается в цепочку обещаний.

0 голосов
/ 27 мая 2019

вы должны изменить

.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(...))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...