В настоящее время я пишу действие, которое как его часть проверяет и увеличивает значение orderID и отвечает им в разговоре.
Код в настоящее время работает, но часть выполнения может занять до 10 секунд, что может привести к тому, что действие на google timeout запрос и завершится неудачно (наряду с медленным, чтобы ответить пользователю, если вообще). Я использую runTransaction
, чтобы убедиться, что никакой другой экземпляр функции на базе Firebase также не может увеличивать ID. Код всех функций и значение действительно увеличивается, но задержка в ответе функции означает намерение, на которое она отвечает, истекает время ожидания и дает ответ отката.
Как вы можете видеть в моем коде ниже, я добавил различные console.log
для отслеживания задержки, между before transaction
и transaction started
при выводе на консоль задержка 8-10 секунд случается. Кто-нибудь может сказать почему?
const functions = require('firebase-functions');
const { dialogflow, Suggestions } = require('actions-on-google');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
const db = admin.firestore();
const settings = {timestampsInSnapshots: true};
db.settings(settings);
const app = dialogflow();
app.intent('order', (conv, {givenname: givenname}) => {
console.log('starting function');
return new Promise(function(resolvei, rejecti){
if(givenname !== undefined){
console.log('before db.collection');
var idRef = db.collection('orderIDs').doc('opho9peCy54tjLR0YmVm');
console.log('before transaction');
var transaction = db.runTransaction(t => {
console.log('transaction started');
return t.get(idRef)
.then(doc => {
console.log('data gotten');
var id = doc.data().ID + 1;
if(id > 99){
id = 1;
}
t.update(idRef, {ID: id});
console.log('update made');
return Promise.resolve(id);
});
}).then(result => {
console.log(result);
conv.close('Thank you, ' + givenname + '. Your order number is ' + result + '.');
resolvei();
}).catch(err => {
console.log('Transaction failure:', err);
rejecti();
});
}
else{
conv.close('Oops, something has gone wrong, try again.');
resolve();
}
});
});
exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);