Вложенные обещания ES6 - внешняя ошибка функции не обнаружена - PullRequest
0 голосов
/ 06 мая 2018

Я новичок в ES6 и серии обещаний. Моя ситуация такова, что исходный сайт вызова вызывает функцию (1), которая затем вызывает другую функцию (2). Попытка получить как функцию 2, так и функцию 1 возвращает обещание в зависимости от успеха или ошибки.

Вот пример, придуманный код:

function level2(data) {
  return new Promise((resolve, reject) => {
    reject('fail')
  })
}

function level1(info) {
  level2('abc').then((response) => {
    return new Promise((resolve, reject) => {
      resolve('success')
    })
  })
}

level1('thing').then((response) => {
  console.log('response2 ' + response)
}).catch(e => {
  console.log('error2 ' + e)
})

Я могу успешно использовать один уровень обещаний. Но когда речь идет о цепочке или вложении обещаний, я не использую их должным образом, поэтому внешний слой, который потребляет обещание, не улавливает ошибку.

Как правильно настроить обещания, чтобы обе функции (уровень 1 и 2) могли возвращать вызывающему абоненту успех или неудачу?

В примере функции (уровень1), ошибка функции (уровень2) будет пузыриться наружу?

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Сначала вам это не нужно:

 new Promise((resolve, reject) =>  reject('fail'))

Для этого есть ярлыки:

 Promise.resolve("success")
 Promise.reject("fail");

Как правильно настроить обещания, чтобы обе функции (уровень 1 и 2) могли возвращать вызывающему абоненту успех или неудачу?

Либо используйте Promise.all, либо Promise.race, чтобы объединить их, либо верните одно из обещаний в тогдашнюю цепочку другого, чтобы они сгладились (как и вы).

В примере функции (уровень1), ошибка функции (уровень2) будет пузыриться наружу?

Да.

0 голосов
/ 06 мая 2018

Вам нужно получить level1, чтобы вернуть обещание.

{
  // level2 reject:
  function level2(data) {
    return new Promise((resolve, reject) => {
      reject('fail inside level2')
    })
  }

  function level1(info) {
    return level2('abc').then((response) => {
      return new Promise((resolve, reject) => {
        resolve('success')
      })
    })
  }

  level1('thing').then((response) => {
    console.log('response2 ' + response)
  }).catch(e => {
    console.log('error2 ' + e)
  });
}

{
  // level1 reject:
  function level2(data) {
    return new Promise((resolve, reject) => {
      resolve('ok');
    })
  }

  function level1(info) {
    return level2('abc').then((response) => {
      return new Promise((resolve, reject) => {
        reject('fail inside level1')
      })
    })
  }

  level1('thing').then((response) => {
    console.log('response2 ' + response)
  }).catch(e => {
    console.log('error2 ' + e)
  });
}
...