Как получить завершенное значение функции asyn c при вызове функции из индекса. js? - PullRequest
0 голосов
/ 04 мая 2020

Я новичок в узле и пытаюсь создать функцию для выполнения запросов API с нумерацией страниц. Функция успешно дает мне желаемый результат, но я не понимаю, как использовать функцию .then () в index. js, поскольку она asyn c. Если я использую await в своем индексе. js, тогда он выдает ошибку. Я надеюсь получить некоторое руководство относительно того, как я могу это исправить, и как я могу лучше понять async / await.

//hs-api.js
const request = require('request-promise');
const settings = require('./settings');
var all = []

let getReq = async (url) => {  
    var options = {
        'method': 'GET',
        'url': url,
        'headers': {
            'Content-Type': 'application/json'
        }
    }
    let results = await request(options, function async (error, response) { 
        if (error) {
            reject(error)
        } else {
            res = JSON.parse(response.body)
        }
    })

    all = all.concat(res.results)

    if(res.hasOwnProperty("paging")) {
        await getReq(`${res.paging.next.link}&apikey=${settings.api_key}`)
    } else {
        console.log(all)
        return all
    }
}

Здесь я вызываю функцию

//index.js
let apiResponse = api.getReq(`https://apiexample.com/?apikey=${settings.api_key}`)
console.log(apiResponse)

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Вам нужно обернуть его в асинхронную функцию c в индексе. js.

    // index.js
    async someFn() {
        let apiResponse = await api.getReq(`https://apiexample.com/?apikey=${settings.api_key}`)
        console.log(apiResponse)
    }

   // call
   someFn();

или используйте «.then»

api.getReq(`https://apiexample.com/?apikey=${settings.api_key}`)
   .then(apiResponse => {
        console.log(apiResponse);
   })
   .catch(console.log);

UPD:

//hs-api.js
const results = await request(options);
// don`t sure, that it is correct error indicator for your library
if(result.error) {
    throw new Error(// describe error here);
}

const res = JSON.parse(response.body);
all = all.concat(res.results);

if(res.hasOwnProperty("paging")) {
    return await getReq(`${res.paging.next.link}&apikey=${settings.api_key}`)
} else {
    console.log(all);
    return all;
}
0 голосов
/ 04 мая 2020

На сегодняшний день (Node.js 14) вам нужно обернуть его в функцию.

Как-то так

(async () => {
    let apiResponse = await api.getReq(`https://apiexample.com/?apikey=${settings.api_key}`)
    console.log(apiResponse)
})()

Существует предложение для ES для верхнего уровня await, который позволит запускать

let apiResponse = await api.getReq(`https://apiexample.com/?apikey=${settings.api_key}`)
console.log(apiResponse)

без включения его в функцию async.

Node.js (начиная с версии 10) имеет экспериментальная поддержка этой функции. Вам нужно запустить его с --experimental-repl-await flag

...