等待函数完成然后 return 对象
Wait for functions to finish then return object
我要return新更新的对象。但是当我尝试使用管道链方法分配值时,它不起作用并且 returns 初始值。
用链式函数和 return 对象赋值的更好方法是什么?
代码如下:
currentUser: UserInterface = {
accessToken: '',
userID: '',
name: '',
email: '',
picture: '',
pageList: [],
activePageID: 0,
activePage: {
name: '',
pageID: '',
instagramID: '',
categoryID: '',
tasks: [],
},
};
login(user: FacebookLoginInterface) {
this.generateLongUserToken(user.accessToken).pipe(
map((response) => {
this.currentUser.accessToken = response.access_token;
this.getUserPages(this.currentUser.accessToken).pipe(
map((response) => {
this.currentUser.pageList = response;
this.getInstagramBusinessAccount(
this.currentUser.pageList[0].id,
this.currentUser.accessToken,
).pipe(
map((response) => {
this.currentUser.activePage.instagramID =
response.instagram_business_account.id;
}),
);
}),
);
}),
);
return {
access_token: this.currentUser,
};
}
使用承诺
login() {
return new Promise((resolve, reject) => {
this.generateLongUserToken(user.accessToken).pipe(
map((response) => {
this.currentUser.accessToken = response.access_token;
this.getUserPages(this.currentUser.accessToken).pipe(
map((response) => {
this.currentUser.pageList = response;
this.getInstagramBusinessAccount(
this.currentUser.pageList[0].id,
this.currentUser.accessToken,
).pipe(
map((response) => {
this.currentUser.activePage.instagramID =
response.instagram_business_account.id;
// If I understand correctly, at this point `currentUser`
// is ready to be returned, so resolve the promise here
resolve()
}),
);
}),
);
}),
);
}).then(() => ({
access_token: this.currentUser,
}))
}
currentUser.login().then(user => {
// Here user is updated
})
您还可以稍微清理一下以减少嵌套级别
login() {
return new Promise((resolve) => {
this.generateLongUserToken(user.accessToken).pipe(
map((response) => {
this.currentUser.accessToken = response.access_token;
resolve(response.access_token)
})
)
}).then((accessToken) => new Promise((resolve) => {
this.getUserPages(this.currentUser.accessToken).pipe(
map((response) => {
this.currentUser.pageList = response;
resolve({pageList: response, accessToken})
})
)
})).then(({pageList, accessToken}) => new Promise(resolve => {
this.getInstagramBusinessAccount(
this.currentUser.pageList[0].id,
this.currentUser.accessToken,
).pipe(
map((response) => {
this.currentUser.activePage.instagramID =
response.instagram_business_account.id;
resolve()
})
)
})).then(() => ({
access_token: this.currentUser,
}))
}
除此之外,仅当 map
中的函数被调用一次时才有效。名称 map
表明回调可能会被多次调用,在这种情况下这将不起作用。无论如何,你应该使用 promises
我要return新更新的对象。但是当我尝试使用管道链方法分配值时,它不起作用并且 returns 初始值。
用链式函数和 return 对象赋值的更好方法是什么?
代码如下:
currentUser: UserInterface = {
accessToken: '',
userID: '',
name: '',
email: '',
picture: '',
pageList: [],
activePageID: 0,
activePage: {
name: '',
pageID: '',
instagramID: '',
categoryID: '',
tasks: [],
},
};
login(user: FacebookLoginInterface) {
this.generateLongUserToken(user.accessToken).pipe(
map((response) => {
this.currentUser.accessToken = response.access_token;
this.getUserPages(this.currentUser.accessToken).pipe(
map((response) => {
this.currentUser.pageList = response;
this.getInstagramBusinessAccount(
this.currentUser.pageList[0].id,
this.currentUser.accessToken,
).pipe(
map((response) => {
this.currentUser.activePage.instagramID =
response.instagram_business_account.id;
}),
);
}),
);
}),
);
return {
access_token: this.currentUser,
};
}
使用承诺
login() {
return new Promise((resolve, reject) => {
this.generateLongUserToken(user.accessToken).pipe(
map((response) => {
this.currentUser.accessToken = response.access_token;
this.getUserPages(this.currentUser.accessToken).pipe(
map((response) => {
this.currentUser.pageList = response;
this.getInstagramBusinessAccount(
this.currentUser.pageList[0].id,
this.currentUser.accessToken,
).pipe(
map((response) => {
this.currentUser.activePage.instagramID =
response.instagram_business_account.id;
// If I understand correctly, at this point `currentUser`
// is ready to be returned, so resolve the promise here
resolve()
}),
);
}),
);
}),
);
}).then(() => ({
access_token: this.currentUser,
}))
}
currentUser.login().then(user => {
// Here user is updated
})
您还可以稍微清理一下以减少嵌套级别
login() {
return new Promise((resolve) => {
this.generateLongUserToken(user.accessToken).pipe(
map((response) => {
this.currentUser.accessToken = response.access_token;
resolve(response.access_token)
})
)
}).then((accessToken) => new Promise((resolve) => {
this.getUserPages(this.currentUser.accessToken).pipe(
map((response) => {
this.currentUser.pageList = response;
resolve({pageList: response, accessToken})
})
)
})).then(({pageList, accessToken}) => new Promise(resolve => {
this.getInstagramBusinessAccount(
this.currentUser.pageList[0].id,
this.currentUser.accessToken,
).pipe(
map((response) => {
this.currentUser.activePage.instagramID =
response.instagram_business_account.id;
resolve()
})
)
})).then(() => ({
access_token: this.currentUser,
}))
}
除此之外,仅当 map
中的函数被调用一次时才有效。名称 map
表明回调可能会被多次调用,在这种情况下这将不起作用。无论如何,你应该使用 promises