Я пытаюсь найти лучший подход к кодированию моей облачной функции Firebase.
Мое требование включает 3 вложенных http-запроса.Второй запрос сделан с данными из первого запроса.И третий запрос с данными от второго.
Я начал свой проект в Typescript, но я прочитал в этом ответе Облачные функции для Firebase Async Style Await , что машинопись не поддерживает async / await (что, я думаю, мне бы хотелосьиспользования).
Я мог бы переключить свой проект обратно на Javascript или, как предлагалось в предыдущем ответе, я мог бы использовать плагин здесь https://github.com/babel/kneden для переноса, но я все еще не уверен, как включить его в мой проект машинописного текста(и как написать асинхронный / ожидающий код после того, как я это сделаю).
Я нашел другой ответ здесь Вложенные HTTP-запросы в облачной функции Firebase , которая похожа, но использует цепочку обещаний.
Моя первая проблема заключается в том, что я не могу решить, какой из 3 подходов выбрать (начать заново с javascript, транспилировать или использовать обещания).Все 3, кажется, имеют недостаток (за исключением, может быть, транспарант, если я могу понять, как).
Вот немного моего кода, использующего Cheerio с запросом-обещанием-родным и Typescript.
Внутри цикла .each есть некоторый закомментированный код, который вызывает вторую функцию для выполнения следующего запроса.Это код, который я хотел бы изменить, чтобы использовать лучший метод.
import * as functions from 'firebase-functions';
import * as cheerio from 'cheerio';
import * as moment from 'moment';
import * as http from 'http';
import * as admin from 'firebase-admin';
import * as request from "request-promise-native";
var urlDate = moment().format('YYYYMMDD');
export const getPlayers = functions.https.onRequest((req, response) => {
var options = {
uri: 'https://www.cbssports.com/nba/scoreboard/',
transform: function (body) {
return cheerio.load(body);
}
};
request(options)
.then(($) => {
$('.live-update').each((i, element) => {
var homeTeamAbbr = $(element).find('tbody').children('tr').eq(0).find('a').html().split("alt/").pop().split('.svg')[0];
var awayTeamAbbr = $(element).find('tbody').children('tr').eq(1).find('a').html().split("alt/").pop().split('.svg')[0];
var homeTeam = $(element).find('tbody').children('tr').eq(0).find('a.team').text().trim();
var awayTeam = $(element).find('tbody').children('tr').eq(1).find('a.team').text().trim();
var homeTeamStatsURL = $(element).find('tbody').children('tr').eq(0).find('td').html();
var awayTeamStatsURL = $(element).find('tbody').children('tr').eq(1).find('td').html();
var gameTime = $(element).find('.pregame-date').text().trim();
homeTeamStatsURL = homeTeamStatsURL.match(/href="([^"]*)/)[1] + "roster";
awayTeamStatsURL = awayTeamStatsURL.match(/href="([^"]*)/)[1] + "roster";
var matchupString = awayTeamAbbr + "@" + homeTeamAbbr;
var URLString = "NBA_" + urlDate + "_" + matchupString;
// var docRef = database.collection('NBASchedule').doc("UpcommingSchedule");
// var boxScoreURL = "www.cbssports.com/nba/gametracker/boxscore/" + URLString;
// var setAda = docRef.set({[URLString]:{
// homeTeam: homeTeam,
// awayTeam: awayTeam,
// date: gameTime,
// homeTeamAbbr: homeTeamAbbr,
// awayTeamAbbr: awayTeamAbbr,
// homeTeamStatsURL: homeTeamStatsURL,
// awayTeamStatsURL: awayTeamStatsURL,
// boxScoreURL: boxScoreURL
// }}, { merge: true });
// getTeamPlayers(homeTeamStatsURL, matchupString);
// getTeamPlayers(awayTeamStatsURL, matchupString);
console.log("retrieved schedule for "+ matchupString + " on " + urlDate)
});
response.send("retrieved schedule");
})
.catch(function (err) {
console.log("error " + err);
});
});
Буду признателен, если кто-нибудь посоветует мне лучшее решение и способ его реализации.Спасибо