#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 };
});