Передача объекта внутри вложенного обещания

#javascript #typescript

#javascript #typescript

Вопрос:

У меня есть связанное обещание. Внутри первого обещания у меня есть объект, который мне нужен и внутри последнего обещания. Как я могу передать этот объект внутри связанного обещания? Есть ли лучшая практика, чем сохранение значения с let home; помощью?

 let home;
return this.httpGetHome(name).then(result => {
  home = result[0];
  return result[0];
}).then(result => {
  return this.httpGetOwner(result.owner);
}).then((result: any) => {
  const owner = Characters.default.find(char => char.name === result.name);
  return {...home, owner};
});
  

Ответ №1:

В этой ситуации вы обычно вкладываете свой обработчик выполнения, чтобы он имел доступ к значению:

 return this.httpGetHome(name).then(result => {
  return result[0];
}).then(home => {
  return this.httpGetOwner(home.owner)
    .then((result: any) => {
      const owner = Characters.default.find(char => char.name === result.name);
      return {...home, owner};
  });
});
  

Но, основываясь на вашем использовании home в конце, это не должно быть обещанием, что означает, что изначально нет причин для отдельных then обработчиков:

 return this.httpGetHome(name).then(([home]) => { // Note the destructuring
  return this.httpGetOwner(home.owner)
    .then((result: any) => {
      const owner = Characters.default.find(char => char.name === result.name);
      return {...home, owner};
  });
});
  

Или в современных средах вы можете использовать async функцию, а затем использовать await внутри нее:

 // In an `async` function
const [home] = await this.httpGetHome(name); // Note the destructuring
const result = await this.httpGetOwner(home.owner);
const owner = Characters.default.find(char => char.name === result.name);
return {...home, owner};
  

Ответ №2:

Или вы можете сделать что-то вроде этого

 return this.httpGetHome(name).then(([home]) => {
  return Promise.all([this.httpGetOwner(home.owner), home]);
}).then(([result, home]) => {
  const owner = Characters.default.find(char => char.name === result.name);
  return { ...home, owner };
});