为什么我在这个函数上得到 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*/);
我正在构建一个使用 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*/);