Распространять отклоненные обещания через .catch ()


3 принят

вторая функция должна идеально улавливать эту ошибку и распространять ее

Нет, распространение по умолчанию. В идеале вам не нужно его вообще ловить, и он будет автоматически распространяться.

Я пробовал вещи, которые все приводят к необработанному обещанию. Каково мое (возможно, фундаментальное) недоразумение?

Вы используете Promiseантипаттерн конструктора ! С его помощью , вы должны позвонить .then(resolve, reject);в catchобработчике , чтобы заставить его работать. Или действительно new Promise. Но это абсолютно не так, как это должно быть сделано.

Вместо этого снимите thenоболочку и просто верните результат thenобработчиков цепочки :

export function secondFunction(id: string): Promise<UserId> {
  return thirdFunction(id)
  .then((data: TableInfo) => {
    if (Object.keys(data).length !== 3) {
      throw new Error('data in database is not mapped properly');
    }
    return getUserId(data);
  });
}

export function thirdFunction(id: string): Promise<TableInfo> {
  let query = `/* query goes here */`;
  return db.executeQuery(query, [id])
  .then((data: TableInfo) => {
    if (Object.keys(data).length < 1) {
      throw new NoResultError('some message here');
    }
    return data;
  });
}
JavaScript, Node.js, машинопись, обещание,

javascript,node.js,typescript,promise,

0

Ответов: 1


3 принят

вторая функция должна идеально улавливать эту ошибку и распространять ее

Нет, распространение по умолчанию. В идеале вам не нужно его вообще ловить, и он будет автоматически распространяться.

Я пробовал вещи, которые все приводят к необработанному обещанию. Каково мое (возможно, фундаментальное) недоразумение?

Вы используете Promiseантипаттерн конструктора ! С его помощью , вы должны позвонить .then(resolve, reject);в catchобработчике , чтобы заставить его работать. Или действительно new Promise. Но это абсолютно не так, как это должно быть сделано.

Вместо этого снимите thenоболочку и просто верните результат thenобработчиков цепочки :

export function secondFunction(id: string): Promise<UserId> {
  return thirdFunction(id)
  .then((data: TableInfo) => {
    if (Object.keys(data).length !== 3) {
      throw new Error('data in database is not mapped properly');
    }
    return getUserId(data);
  });
}

export function thirdFunction(id: string): Promise<TableInfo> {
  let query = `/* query goes here */`;
  return db.executeQuery(query, [id])
  .then((data: TableInfo) => {
    if (Object.keys(data).length < 1) {
      throw new NoResultError('some message here');
    }
    return data;
  });
}
JavaScript, Node.js, машинопись, обещание,
Похожие вопросы