微软图形API Javascript SDK承诺

微软图形API Javascript SDK承诺,javascript,async-await,Javascript,Async Await,我刚刚摆脱了承诺链接,因为它非常混乱,并继续使用异步等待。我仍然无法获得所需的结果。如何从下面的代码中获得finalResult()的结果。它不断地返回未兑现的承诺。我试着做了以下几件事 让sampleData=等待最终结果() 这里我如何从sampleData获取数据?我还试着给finalResult附加一个then调用,但也没有成功。有什么帮助吗?我只需要下面代码中的channelData app.get("/graph/getChannelEvents", (req, res) =>

我刚刚摆脱了承诺链接,因为它非常混乱,并继续使用异步等待。我仍然无法获得所需的结果。如何从下面的代码中获得finalResult()的结果。它不断地返回未兑现的承诺。我试着做了以下几件事

让sampleData=等待最终结果()

这里我如何从sampleData获取数据?我还试着给finalResult附加一个then调用,但也没有成功。有什么帮助吗?我只需要下面代码中的channelData

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
也不会返回任何内容。