Как я могу вернуть разные значения из функции в зависимости от кода внутри обещания Ax ios? NodeJS - а - PullRequest
0 голосов
/ 15 марта 2020

У меня есть блок кода, который вызывает API и сохраняет результаты, если есть различия или нет. Я хотел бы вернуть различные значения для DATA, как выложено в коде. Но это, очевидно, не работает, поскольку его возвращение не определено.

let compare = (term) => {
let DATA;
//declare empty array where we will push every thinkpad computer for sale.
let arrayToStore = [];
//declare page variable, that will be the amount of pages based on the primary results
let pages;
//this is the Initial get request to calculate amount of iterations depending on result quantities.
axios.get('https://api.mercadolibre.com/sites/MLA/search?q='+ term +'&condition=used&category=MLA1652&offset=' + 0)
.then(function (response) {
 //begin calculation of pages
 let amount = response.data.paging.primary_results;
 //since we only care about the primary results, this is fine. Since there are 50 items per page, we divide
 //amount by 50, and round it up, since the last page can contain less than 50 items
 pages = Math.ceil(amount / 50);

 //here we begin the for loop.
 for(i = 0; i < pages; i++) {
    // So for each page we will do an axios request in order to get results
    //Since each page is 50 as offset, then i should be multiplied by 50.
    axios.get('https://api.mercadolibre.com/sites/MLA/search?q='+ term +'&condition=used&category=MLA1652&offset=' + i * 50)
    .then((response) => {
        const cleanUp = response.data.results.map((result) => {
            let image = result.thumbnail.replace("I.jpg", "O.jpg");
             return importante = {
                id: result.id,
                 title: result.title,
                 price: result.price,
                 link: result.permalink,
                 image: image,
                 state: result.address.state_name,
                 city: result.address.city_name
            }
        });
        arrayToStore.push(cleanUp);
        console.log(pages, i)
        if (i === pages) {
            let path = ('./compare/yesterday-' + term +'.json');


                if (fs.existsSync(path)) {
                    console.log("Loop Finished. Reading data from Yesterday")
                    fs.readFile('./compare/yesterday-' + term +'.json', (err, data) => {
                        if (err) throw err;
                        let rawDataFromYesterday = JSON.parse(data);
                        // test
                        //first convert both items to check to JSON strings in order to check them.
                        if(JSON.stringify(rawDataFromYesterday) !== JSON.stringify(arrayToStore)) {
                            //Then Check difference using id, otherwise it did not work. Using lodash to help.
                            let difference = _.differenceBy(arrayToStore[0], rawDataFromYesterday[0],'id');
                            fs.writeFileSync('./compare/New'+ term + '.json', JSON.stringify(difference));
                            //if they are different save the new file.
                            //Then send it via mail
                            console.log("different entries, wrote difference to JSON");
                            let newMail = mail(difference, term);
                            fs.writeFileSync('./compare/yesterday-' + term +'.json', JSON.stringify(arrayToStore));
                            DATA = {
                                content: difference,
                                message: "These were the differences, items could be new or deleted.",
                                info: "an email was sent, details are the following:"
                            }
                            return DATA;
                        } else {
                            console.log("no new entries, cleaning up JSON"); 
                            fs.writeFileSync('./compare/New'+ term + '.json', []);
                            DATA = {
                                content: null,
                                message: "There were no difference from last consultation",
                                info: "The file" + './compare/New'+ term + '.json' + ' was cleaned'
                            }
                            return DATA;
                        }

                    });
                } else {
                    console.error("error");
                    console.log("file did not exist, writing new file");
                    fs.writeFileSync('./compare/yesterday-' + term +'.json', JSON.stringify(arrayToStore));
                    DATA = {
                        content: arrayToStore,
                        message: "There were no registries of the consultation",
                        info: "Writing new file to ' " +  path + "'"
                    }
                    return DATA;
                }






        }

    })
 }  

}).catch(err => console.log(err));





}


    module.exports = compare

Поэтому я экспортирую эту функцию сравнения, которую я вызываю в моем приложении. js. Я хочу, чтобы эта функция сравнения возвращала объект DATA, чтобы я мог отображать фактические сообщения на внешнем интерфейсе,

Я надеюсь, поместив эту функцию сравнения (термин) в маршрут в приложении. js вот так:

app.get("/api/compare/:term", (req, res) => {
    let {term} = req.params
    let data = compare(term);
    res.send(data);
})

Но, как я уже сказал, его возвращение не определено. Я пытался с asyn c await или с возвратом всего топора ios первый топор ios вызов, но я всегда возвращаю неопределенное.

Спасибо

...