微软图形API Javascript SDK承诺
我刚刚摆脱了承诺链接,因为它非常混乱,并继续使用异步等待。我仍然无法获得所需的结果。如何从下面的代码中获得finalResult()的结果。它不断地返回未兑现的承诺。我试着做了以下几件事 让sampleData=等待最终结果() 这里我如何从sampleData获取数据?我还试着给finalResult附加一个then调用,但也没有成功。有什么帮助吗?我只需要下面代码中的channelData微软图形API Javascript SDK承诺,javascript,async-await,Javascript,Async Await,我刚刚摆脱了承诺链接,因为它非常混乱,并继续使用异步等待。我仍然无法获得所需的结果。如何从下面的代码中获得finalResult()的结果。它不断地返回未兑现的承诺。我试着做了以下几件事 让sampleData=等待最终结果() 这里我如何从sampleData获取数据?我还试着给finalResult附加一个then调用,但也没有成功。有什么帮助吗?我只需要下面代码中的channelData app.get("/graph/getChannelEvents", (req, res) =>
app.get("/graph/getChannelEvents", (req, res) => {
var idToken = req.query.idToken;
var teamId = req.query.teamId;
var channelData = req.query.channelData;
var tenantId = process.env.TENANT_ID;
if (!idToken) {
res.status(500).send("Could not find id token");
return;
}
request(
`https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token`,
{
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
form: {
grant_type: "urn:ietf:params:oauth:grant-type:jwt-bearer",
client_id: process.env.APP_ID,
client_secret: process.env.APP_Secret,
scope: "Calendars.Read",
requested_token_use: "on_behalf_of",
assertion: idToken,
},
},
async (error, response, body) => {
const accessToken = JSON.parse(body)["access_token"];
var client = MicrosoftGraph.Client.init({
defaultVersion: "v1.0",
debugLogging: true,
authProvider: (done) => {
done(null, accessToken);
},
});
async function finalResult() {
let cdata = await client
.api(`/groups/${teamId}/events`)
.header("Prefer", 'outlook.timezone="Pacific Standard Time"')
.select("subject,onlinemeeting,start,end")
.get();
let channelData = await cdata.value.map(async (org) => {
var channelId = url
.parse(decodeURIComponent(org.onlineMeeting.joinUrl))
.pathname.split("/")[3];
var sessionData = await client
.api(`/teams/${teamId}/channels`)
.filter(`startswith(id, '${channelId}')`)
.select("displayName")
.get();
let myData = await sessionData.value.map(async (u) => {
return {
sessionName: org.subject,
channelName: u.displayName,
channelId: channelId,
startDate: org.start.dateTime.split("T")[0],
endDate: org.end.dateTime.split("T")[0],
startTime: org.start.dateTime.split("T")[1],
endTime: org.end.dateTime.split("T")[1],
};
});
});
console.log(channelData);
}
finalResult();
}
);
});
一个很好的解决方案是使用一个异步的承诺,该承诺包装了整个显示的代码,并使用一个函数返回该承诺 在那之后,你会想要做出一系列的承诺,能够一次调用它们,并在继续之前等待所有结果。您可以使用
Promise.all()
调用数组中的所有Promise,并像使用单个Promise和一样使用它。从then()接收的值将是一个数组,其中包含promiseArray承诺的所有结果
var getStuff = () => {
//First and big promise starts here
return new Promise( (resolve, reject) => {
client.api(`/groups/${teamId}/events`)
.header("Prefer", 'outlook.timezone="Pacific Standard Time"')
.select("subject,onlinemeeting,start,end")
.get()
.then((result) => {
// Create an array for your promises
var promisesArray = [];
result.value.map((org) => {
// Fill your array with every promise you need, each one containing just one call to your api
promisesArray.push(new Promise((arrayResolve, arrayReject) => {
console.log("top: " + org.subject);
var channelId = url
.parse(decodeURIComponent(org.onlineMeeting.joinUrl))
.pathname.split("/")[3];
client
.api(`/teams/${teamId}/channels`)
.filter(`startswith(id, '${channelId}')`)
.select("displayName")
.get()
.then((result) => {
const cdata = result.value.map((u) => {
console.log("down " + org.subject);
return {
sessionName: org.subject,
channelName: u.displayName,
channelId: channelId,
startDate: org.start.dateTime.split("T")[0],
endDate: org.end.dateTime.split("T")[0],
startTime: org.start.dateTime.split("T")[1],
endTime: org.end.dateTime.split("T")[1],
};
});
})
.then((result) => {
// Resolve individual promises
arrayResolve(result);
}).catch((err) => {
reject(err);
})
}));
})
// This executes all the promises at the same time
Promise.all(promisesArray).then( (finalResult) => {
// Resolve big and initial promise
resolve(finalResult);
}).catch((err) => {
reject(err);
})
})
})
}
(注意:我只是将您现有的代码包装在一个函数中,并完成了所需的大括号和圆括号。然后我添加了一些承诺,使其能够按预期工作,但需要添加一些代码才能工作,因为我注意到您调用了一些未在显示的代码中定义的变量)
在此之后,您可以调用此函数并使用“.then()”来接收所需的值
希望这有帮助 我已经用async/await now修改了我以前的代码,并在论坛上重新发布了它,但它仍然不起作用。任何帮助都将不胜感激。您在新代码中犯了类似的错误。您现在没有收集结果并返回它们。您的channelData
变量不会接收任何内容,因为第一个map函数没有返回任何内容!此外,函数finalResult
也不会返回任何内容。