Firebase Functions (TypeScript) ищет в базе данных значение синхронно - PullRequest
0 голосов
/ 30 июня 2018

Я использую функции Firebase. По сути, API соответствует одной функции. Итак, я должен вернуть результат в функции. См. Псевдокод ниже.

export const someAPI = functions.https.onRequest((...) =>{
     parameter = get the parameter from the request
     data = searchDatabase(parameter)

     if data is not null
          do something and create a result
     else
          do something else and create a different result

     send the result as response.
});

Я создал функцию searchDatabase, и она работает. Проблема в том, что результат запроса получен с помощью обратного вызова.

function searchDatabase(token:string):string
{
    const db = admin.database().ref("mydata");
    db.....once("value",
        function(snapshot){
            snapshot.forEach(
                function(data)
                {
                    const deviceId = data.val().id;
                    return false;
                }
            );
         }
    )

    return ?; <- I need to return `deviceId` at this point.
}

Я прочитал этот ответ , и я хотел бы принять "голубую таблетку", но этот ответ был для Java, и кажется, что для TypeScript нет semaphore. Могу ли я сделать подобное в TypeScript?


После прочтения комментария я решил использовать async / wait. Я не знаю, как сделать саму функцию API асинхронной, поэтому я сделал это.

export const someAPI = functions.https.onRequest((request, response) =>{
  realFunction(request, response);
});

async function realFunction(request: express.Request, response: express.Response)
{
     parameter = get the parameter from the request
     data = await searchDatabase(parameter)

     if data is not null
          do something and create a result
     else
          do something else and create a different result

     send the result as response.
 }

и я заставил функцию searchDatabase вернуть Обещание.

async function searchDatabase(token:string): Promise<string>
{
    return new Promise<string>((resolve, reject) => {
        const db = admin.database().ref("mydata");
        db.orderByChild("..").equalTo(token).once("value")
            .then(function(snapshot){
                snapshot.forEach(
                    function(data)
                    {
                        //match found, but what about all other cases?
                        const deviceId = data.val().id;
                        resolve(deviceId); 
                        return false;
                    }
                );
                resolve(null);
             })
             .catch(reason=>{resolve(null);})
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...