Дождитесь ответа Алголии, прежде чем возвращать функцию Cloud - PullRequest
0 голосов
/ 15 сентября 2018

Я только что внедрил algolia в свой бэкэнд и протестировал его с помощью функции http.

Однако теперь мне нужно использовать поиск Algolia с вызываемой функцией.Проблема в том, что он возвращает (нулевые) результаты до того, как Алголия дает ответ (из-за асинхронности).

Я знаю, что, вероятно, должен дать обещание и дождаться возвращения Алголии, но как я могу это сделать??Algolia использует свои собственные методы, и я не уверен, как реализовать обещание.

В их документации есть пример того, как ждать ответа, но он показывает только добавление или получение одного объекта,который обрабатывается иначе, чем поиск.

Вот моя функция:

exports.searchDataInAlgolia = functions.https.onCall((data, context) => {
    var algoliaClient = algoliasearch(ALGOLIA_APP_ID, ALGOLIA_ADMIN_KEY);
    var ALGOLIA_INDEX_NAME = 'users';
    var algoliaIndex = algoliaClient.initIndex(ALGOLIA_INDEX_NAME);

    algoliaIndex.search({
        query: data.textToSearch
    })
        .then(function (responses) {
            return responses.hit;
        });

})

Как мне ждать, пока Алголия извлечет все данные, прежде чем возвращать response.hit? ​​

Вот как я вызываю облачную функцию:

searchForUser = (textToSearch) => {

        var searchDataInAlgolia = firebase.functions().httpsCallable('searchDataInAlgolia');
        searchDataInAlgolia({
            textToSearch: textToSearch,
        }).then(function (result) {
            return result.data;
            //Future data manipulation/filtering
        }).then(res => {
            console.log(res);
        })
    }

И я вызываю эту функцию из onPress на RN, передавая строковый параметр, но это точно не проблема.

1 Ответ

0 голосов
/ 15 сентября 2018

Вам также необходимо вернуть результат search:

exports.searchDataInAlgolia = functions.https.onCall((data, context) => {
    var algoliaClient = algoliasearch(ALGOLIA_APP_ID, ALGOLIA_ADMIN_KEY);
    var ALGOLIA_INDEX_NAME = 'users';
    var algoliaIndex = algoliaClient.initIndex(ALGOLIA_INDEX_NAME);

    return algoliaIndex.search({
        query: data.textToSearch
    })
    .then(function (responses) {
        return responses.hit;
    });    
})

Без этого функция завершается сразу после выполнения последнего }), вместо того, чтобы ждать результатов от Algolia.назад (асинхронно).

...