почему agent.add нужно «возвращать» из запроса пожарного хранилища в диалоговом потоке? - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть функция в выполнении диалогового потока, которая вызывается при совпадении намерения. он запрашивает базу данных пожарного магазина. во-первых, я не совсем понимаю, почему самому запросу требуется ключевое слово return, а также почему должен быть возвращен agent.add. Я предполагаю, что это как-то связано с тем, как работают обещания.

function one(agent) {

    let userRef = db.collection('users');
    let queryRef = userRef.where("uId", "==", "1");

    return queryRef.get().then(function(doc) {
        if (doc.exists) {
            console.log("Document data:", doc.data());
            return agent.add(some info from the doc);
        } else {
            // doc.data() will be undefined in this case
            console.log("No such document!");
            return agent.add("error");
        }
    }).catch(function(error) {
        console.log("Error getting document:", error);
    });

}

Еще одна вещь, которую я заметил, что я не совсем понимаю. Если у меня есть функция одна и две, и я помещаю запрос в функцию два, он не будет работать.

function one(agent) {

    function two();

}

function two() {

    function one(agent) {

        let userRef = db.collection('users');
        let queryRef = userRef.where("uId", "==", "1");

        return queryRef.get().then(function(doc) {
            if (doc.exists) {
                console.log("Document data:", doc.data());
                return agent.add(some info from the doc);
            } else {
                // doc.data() will be undefined in this case
                console.log("No such document!");
                return agent.add("error");
            }
        }).catch(function(error) {
            console.log("Error getting document:", error);
        });

    }
}

1 Ответ

0 голосов
/ 24 февраля 2020

Когда вы запускаете этот код в DialogFlow, он запускается в среде облачных функций Google. Google поддерживает время выполнения облачных функций, пока оно необходимо.

По умолчанию Cloud Functions останавливает контейнер после запуска окончательного } вашего кода. Но в вашем случае вызов queryRef.get() происходит асинхронно, поэтому все еще выполняется к моменту выполнения }. Чтобы облачные функции не могли завершить ваш код до завершения вызова базы данных, вы возвращаете возвращаемое значение из queryRef.get() в облачные функции, что является так называемым обещанием.

Когда Cloud Functions получает обещание из вашего кода, оно поддерживает функцию до тех пор, пока это обещание не будет выполнено. Таким образом, возвращая обещание из queryRef.get() ваша среда облачных функций будет оставаться активной до тех пор, пока не будет завершен вызов базы данных.

В том же духе agent.add - это асинхронный вызов, который записывает ответ вызывающему агенту. Чтобы предотвратить преждевременное завершение этого вызова облачными функциями, вам также необходимо вернуть результат из agent.add в облачные функции.

По природе обещаний, когда вы возвращаете обещание внутри then(), обещание по существу всплывает. Таким образом, облачные функции заканчивают ожиданием, пока оба запроса к базе данных и завершения ответа не закончатся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...