Обещание разрешить даже в случае ошибки и вызвать следующую функцию - PullRequest
0 голосов
/ 03 октября 2019

В некоторых случаях getData выдаст ошибку, но мне все равно нужно ее устранить. Как мне разрешить 'getData' и убедиться, что updateInfo вызывается, даже если 'getData' выдает ошибку?

getData(this.props.data, {})
  .then(
    () => updateInfo('UPDATE_INFO', path, data)
  );

Как это исправить?

Promise.resolve(
  getData(this.props.data, {}))
    .then(
      () => updateInfo('UPDATE_INFO', path, data)
    );

Ответы [ 4 ]

1 голос
/ 03 октября 2019

Если вы не хотите использовать окончательно из-за более старой версии Node или из-за обещания синей птицы.

.then принимает второй параметр для отклонения обещания

getData(this.props.data, {})
    .then(
        () => updateInfo('UPDATE_INFO', path, data), (error) => updateInfo('UPDATE_INFO', path, data)
    );

Или также реализовать тот же код в .catch

getData(this.props.data, {})
    .then(
        () => updateInfo('UPDATE_INFO', path, data)
    ).catch(error => {
        console.log(error)
        return updateInfo('UPDATE_INFO', path, data)
    })
1 голос
/ 03 октября 2019

Из вашего примера неясно, что path и data возвращаются getData() или нет, что немного меняет ответ.

Если вы хотите выполнить то же самоеобратный вызов независимо от того, разрешено или отклонено возвращенное обещание (и вам не нужно получать path и data из getData()), вы можете использовать Promise.prototype.finally():

getData(this.props.data, {})
  .finally(() => updateInfo('UPDATE_INFO', path, data));

В качестве альтернативы,если вы хотите вести себя по-разному в зависимости от того, разрешено или отклонено обещание (т. е. path и data возвращаются getData()), вы можете сделать что-то вроде:

getData(this.props.data, {})
  .catch(e => /* handle error */) // If this callback doesn't throw an error or return a promise that rejects, it returns a resolved promise
  .then((path = null, data = {}) => updateInfo('UPDATE_INFO', path, data));
1 голос
/ 03 октября 2019

Правильный способ сделать это будет с Promise.finally () , но если у вас его нет, вы можете запустить следующую функцию как в фазе then(), так и catch(). :

getData(this.props.data, {})
    .then(
        () => updateInfo('UPDATE_INFO', path, data)
    ).catch(
        () => updateInfo('UPDATE_INFO', path, data)
    );

Которые вы могли бы преобразовать в:

const update = updateInfo.bind(null,'UPDATE_INFO', path, data);
getData(this.props.data, {})
    .then(update)
    .catch(update);

Или, проще:

const update = updateInfo.bind(null,'UPDATE_INFO', path, data);
getData(this.props.data, {}).then(update,update);
1 голос
/ 03 октября 2019

Вместо того, чтобы преднамеренно разрешить обещание, если вы хотите выполнить действие как в случае ошибки, так и в случае успеха, вы можете использовать .finally в обещании

getData(this.props.data, {}).finally(() => updateInfo('UPDATE_INFO', path, data));
...