首页 > 解决方案 > 等待 map 完成,然后用 Promise 写一个日志

问题描述

我正在开发一个简单的应用程序,该应用程序将通过 DialogFlow (Google) 并向我发送根据用户评论获取的意图。

我有以下代码。

let writeToExcel = [];



 var promises = xlData.map(data => {
   detectIntentText(data.QUESTION);
 });

 Promise.all(promises).then(function(results) {
   console.log(results);
   console.log(writeToExcel);
 })

但是,打印的数组都是未定义的,它在函数detectIntentText完成地图中的所有内容之前打印。可能有超过 1000 个条目。

让它发挥作用的最佳方法是什么?

这是detectIntentText函数

async function detectIntentText(userText) {
  const sessionId = Math.random().toString(36).substring(7);
  const sessionPath = client.projectLocationAgentSessionPath(
    projectId,
    location,
    agentId,
    sessionId
  );
  console.info(sessionPath);

  const request = {
    session: sessionPath,
    queryInput: {
      text: {
        text: userText,
      },
      languageCode,
    },
  };
  const [response] = await client.detectIntent(request);
  // console.log(`User Query: ${userText}`);
  var intent = "";
  for (const message of response.queryResult.responseMessages) {
    if (message.text) {
      // console.log(`Agent Response: ${message.text.text}`);
    }
  }
  if (response.queryResult.match.intent) {
    // console.log(
    //   `Matched Intent: ${response.queryResult.match.intent.displayName}`
    //);
    intent = response.queryResult.match.intent.displayName;
  }
  // console.log(
  //   `Current Page: ${response.queryResult.currentPage.displayName}`
  // );

  let jsonToWrite = {
    CX_QUESTION: userText,
    INTENT: intent
  }

  // console.log(jsonToWrite);

  writeToExcel.push(jsonToWrite);
}

标签: javascript

解决方案


您没有从map. 如果detectIntentText()返回Promise,那么你的代码应该是

 var promises = xlData.map(data => {
   return detectIntentText(data.QUESTION);
 });

 Promise.all(promises).then(function(results) {
   console.log(results);
   console.log(writeToExcel);
 })

您可以像这样摆脱return关键字,

var promises = xlData.map(data => detectIntentText(data.QUESTION));

推荐阅读