Используйте обещание или Async await в функции Firebase Cloud для запроса Http с Typescript - PullRequest
0 голосов
/ 16 декабря 2018

Я пытаюсь найти лучший подход к кодированию моей облачной функции 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);
});



});

Буду признателен, если кто-нибудь посоветует мне лучшее решение и способ его реализации.Спасибо

...