Я использую функции 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);})
});
}