我试图将这个经过身份验证的用户数组发送到一个数组中以显示连接的帐户。它没有被推入用户数组。也许承诺并没有得到解决。但是,我可以在控制台中看到响应。
async function getInstagramUserDetails() {
let users = [];
new Promise((resolve) => {
window.FB.api("/me/accounts", (response) => {
if (response?.data?.length) {
response.data.map((account) => // response.data is the array of authenticated users associated with this account having id and access_token to get other details required for below API
window.FB.api(
`/${account.id}?fields=name,username,instagram_business_account&access_token=${account.access_token}`,
(res) => {
console.log(res) // Able to see this object in the console
const authUser = resolve(res)
users.push(authUser);
}
)
);
} else {
window.FB.api("/me", (response) => {
const authUser = resolve(response)
users.push(authUser);
});
}
});
});
console.log("User", users); // This is still an empty array
return users;
}
我甚至尝试做users.push(res)
而不像resolve(res)
那样解决它,因为我从API获得res对象。但它并没有推动它。我们能做什么或者有其他的方法吗?
一些问题:
async
是没有用的,除非你在该函数中使用await
。- 多次调用
resolve
无效。只有第一个呼叫计数 resolve
总是返回undefined
,因此将其赋值给authUser
并不是很有帮助map
返回一个数组,您不使用它。要么不使用.map
,要么使用返回的数组
如果您首先承诺FB.api
函数,事情会变得更容易:
const asyncApi = (...args) => new Promise(resolve => window.FB.api(...args, resolve));
然后:
async function getInstagramUserDetails() {
const data = (await asyncApi("/me/accounts"))?.data;
const users = await Promise.all(data?.length
? data.map(({id, access_token}) =>
asyncApi(`/${id}?fields=name,username,instagram_business_account&access_token=${access_token}`)
)
: [asyncAapi("/me")]
);
console.log("Users", users);
return users;
}