为什么我在这个函数上得到 undefined ?

why am I getting undefined on this function?

我正在构建一个使用 Airtable 作为数据库的 dialogflow 代理(库:airtable js)

一切正常,除了我无法从函数中“获取”值以便将其发送回 dialogflow 代理。

函数

function showSinglePrice(agent) {
    var finalPrice;
    var arraySinglePrice = null;

    const item = agent.context.get("item"),
      place = item.parameters.place,
      size = item.parameters.size,
      type = item.parameters.type;

    base(tablePlaces)
      .select({
        maxRecords: 10,
        view: viewName,
        filterByFormula: `AND({type} = "${type}",{size} = "${size}",{place} = "${place}")` 
      })
      .firstPage(function(error, records) {
        if (error) {
          response.send({ error: error });
        } else {
          arraySinglePrice = records.map(record => {
            return {
              price: record.get("price")
            };
          });

          console.log(arraySinglePrice); //this works fine

          finalPrice = arraySinglePrice[0].price; //this works fine

          return finalPrice;
        }
      });   
   
    agent.add(`I wanted to get the result in here: ${finalPrice}`); //undefined
  }

我是异步编程的新手,所以我可能搞砸了 Airtable js 的承诺,但不知道如何让它工作。

非常感谢任何帮助

编辑

感谢@PRISONER 的帮助。

对于有需要的人,这里是工作代码:

function showSinglePrice(agent) {    

    const item = agent.context.get("item"),
      place = item.parameters.place,
      size = item.parameters.size,
      type = item.parameters.type;

    return base(tablePlaces) //defined variable before this function
      .select({
        maxRecords: 1, //just want 1
        view: viewName, //defined variable before this function
        filterByFormula: `AND({type} = "${type}",{size} = "${size}",{place} = "${place}")`
      })
      .firstPage()
      .then(result => {
        
        console.log(result);

        var getPrice = result[0].fields.price;

        agent.add(`the current price is: $ ${getPrice}`); //its working
      })
      .catch(error => {
        console.log(error);

        response.json({
          fulfillmentMessages: [
            {
              text: {
                text: ["We got the following error..."] //will work on it
              }
            }
          ]
        });
      });
  }

您是对的,您使用 Promises 的方式存在一些问题。您在 firstPage() 的调用中使用了回调函数,而不是 return Promise。所以你可以把那部分写成这样:

  .firstPage()
  .then( records => {
    // Work with the records here
  })
  .catch( err => {
    // Deal with the error
  });

一旦你处理了 Promises,你想做的一切都必须在 .then() 块内完成。因此,您需要将 agent.add() 移到那里。

需要return Promise,因此 Dialogflow 知道正在进行异步操作。由于 .then().catch() 函数 return 一个 Promise,你可以 return 整个表达式的结果。所以像

  return base(tablePlaces)
      .select(query)
      .firstPage()
      .then(/*function*/)
      .catch(/*function*/);