Опубликовать запрос на ожидание функции - PullRequest
0 голосов
/ 15 сентября 2018

Я знаю, что вопрос задают очень часто, и я мог бы получить за это отрицательный голос. Но мне действительно трудно понять, как я могу подождать, пока функция обработает данные, прежде чем вернуть значение.

Я просматривал много популярных сообщений (например, здесь ), но я не могу добиться того, чего хочу.

Вот мой код:

   app.post("/video_url", function (req, res) {
       videoProcessed = videoScraper(req.body.videoURL.videoURL);
       res.send(videoProcessed);
   });

Эта функция не ожидает обработки данных:

function videoScraper(url) {
console.log("URL to Scraper: " + url);
const options = {
    uri: `${url}`,
    transform: function(body) {
        return cheerio.load(body);
    }
};

var videoProcessed;

rp(options)
    .then(($) => {
        videoProcessed = $("body").find("iframe").attr("src");
        return videoProcessed;
    })
    .catch((err) => {
        console.log(err);
    });
}

Я пытался использовать обратные вызовы, но это становится действительно грязным, и я не знаю, как было вставить обещание (если оно есть) в мой код.

Ответы [ 3 ]

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

Использовать async / await

app.post("/video_url", async (req, res)=> {
try{
    let videoProcessed = await videoScraper(req.body.videoURL.videoURL);
    res.send(videoProcessed);
}
catch(ex){
// handle the exception
}
});

const videoScraper = async fuction(url) {
console.log("URL to Scraper: " + url);
let options = {
    uri: `${url}`,
    transform: function(body) {
        return cheerio.load(body);
    }
};
try{
let temp = await rp(options);
let videoProcessed = $("body").find("iframe").attr("src");// you can return it directly
return videoProcessed;
}
catch(ex){
// handle the exception
}
}

если ваш узел <8, то используйте обещания (<a href="https://www.npmjs.com/package/bluebird" rel="nofollow noreferrer"> bluebird module)

const bluebird = require('bluebird');
function videoScraper(url){
return new bluebird(function(resolve,reject){
let options = {
    uri: `${url}`,
    transform: function(body) {
        return cheerio.load(body);
    }
};
rp(options)
.then(($)=>{
resolve($("body").find("iframe").attr("src"));
})
.catch(err=>{
return err;
})
})
}
app.post("/video_url", (req, res)=> {
videoScraper(req.body.videoURL.videoURL)
.then(result=>{
res.send(result)
})
.catch(err=>{
// handle the error
})
});

Не используйте const для объявления переменной, если ее значение не является константой, и обычно используйте let вместо var

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

Вы можете попробовать следующее:

app.post("/video_url", function (req, res) {
    videoScraper(req.body.videoURL.videoURL)
        .then(videoProcessed => {
            res.send(videoProcessed);
        })
        .catch(err => {
            // render proper response with error message
        })
});

И изменить функцию на что-то, как показано ниже, чтобы вернуть обещание от того же самого:

function videoScraper(url) {
    console.log("URL to Scraper: " + url);
    const options = {
        uri: `${url}`,
        transform: function(body) {
            return cheerio.load(body);
        }
    };

    return rp(options)
        .then(($) => {
            videoProcessed = $("body").find("iframe").attr("src");
            return videoProcessed;
        });
}
0 голосов
/ 15 сентября 2018

Добавьте await и async (если у вас есть узел 8 +):

app.post("/video_url", async function (req, res) {
    const videoProcessed = await videoScraper(req.body.videoURL.videoURL);
    res.send(videoProcessed);
});

И в вашей функции videoScraper вам нужно вернуть rp!:

function videoScraper(url) {
    console.log("URL to Scraper: " + url);
    const options = {
        uri: `${url}`,
        transform: function(body) {
            return cheerio.load(body);
        }
    };

    return rp(options)
    .then($ => $("body").find("iframe").attr("src"))
    .catch((err) => {
        console.error(err);
    });
}

Это будет зависеть от videoScrapper, работающего нормально, я понятия не имею, что такое rp, поэтому я не могу сказать.

Не забудьте разобратьсяvideoProcessed === undefined (случай ошибки) в первом фрагменте кода.Он также может быть абстрагирован с помощью express-promise-router, который даже будет отлавливать асинхронные ошибки ... Это еще дальше.

Не стесняйтесь читать await & async, действительно замечательно писать асинхронный код натак же, как синхронный код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...