node.js экспортированная цепочка обещаний не работает последовательно с обратными вызовами веб-API - PullRequest
1 голос
/ 19 февраля 2020

У меня есть 2 файла. Один (get_data. js) получает данные из API, получая токен доступа, используя его для получения URL-адреса, содержащего данные, затем получая данные csv из этого URL-адреса и преобразовывая их в JSON. Второй файл (process_data. js) просто console.logs, который JSON data.

Содержимое get_data. js (в псевдокоде, так как файл довольно длинный и все отдельные функции работают). работает нормально).

module.exports.getData = () => {
    new Promise((resolve, reject) => {
        resolve(get_access_token());           // returns an access token from a web api
    })

    .then((access_token) => {
        return new Promise((resolve, reject) => {
            resolve(get_url());                // returns a url from a web api
        })
    })

    .then((url) => {
        return new Promise ((resolve, reject) => {
            resolve(get_data_from_url(url));    // returns a csv in a string from url
        })
    })

    .then((csv_data) => {
        return new Promise ((resolve, reject) => {
            resolve(convert_csv_to_json());    // returns data in a json string
        })    
    })
}

Содержимое process_data. js:

const dataHandler = require('./get_data');

dataHandler.getData()
.then(
    (JSON_data) => {
        console.log("JSON_data: ".concat(JSON_data))
    }
)

То, что я хочу, это

  • run process_data. js
  • получает данные из get_data. js
  • выводит эти данные на консоль (пока)

Однако при первом обратном вызове API в get_data . js, цепочка обещаний из process_data. js продолжается и печатает 'undefined', и я не уверен, почему он не ждет различных обратных вызовов от get_data. js. Странно, что если я запускаю get_data. js с console.log (json_data), добавленным в конец кода, все работает нормально. Проблема в том, что мне нужно разделить мой код на модули. Любая помощь будет принята с благодарностью! Ошибка, напечатанная на консоли ниже:

.then((JSON_data) => {console.log("JSON_data: ".concat(JSON_data))})
^

TypeError: Cannot read property 'then' of undefined
    at Object.<anonymous> (/Users/tom/Desktop/stuff/process_data.js:5:1)
    at Module._compile (internal/modules/cjs/loader.js:955:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:991:10)
    at Module.load (internal/modules/cjs/loader.js:811:32)
    at Function.Module._load (internal/modules/cjs/loader.js:723:14)
    at Function.Module.runMain (internal/modules/cjs/loader.js:1043:10)
    at internal/main/run_main_module.js:17:11

1 Ответ

1 голос
/ 19 февраля 2020

В getData вы сейчас ничего не возвращаете. Вот почему ошибка TypeError: Cannot read property 'then' of undefined, так как при возврате ничего не возвращается undefined.

Чтобы .then на dataHandler.getData() вам необходимо вернуть ваш первый new Promise.

module.exports.getData = () => {
    return new Promise((resolve, reject) => {
        resolve(get_access_token());           // returns an access token from a web api
    })

    .then((access_token) => {
        return new Promise((resolve, reject) => {
            resolve(get_url());                // returns a url from a web api
        })
    })

    .then((url) => {
        return new Promise ((resolve, reject) => {
            resolve(get_data_from_url(url));    // returns a csv in a string from url
        })
    })

    .then((csv_data) => {
        return new Promise ((resolve, reject) => {
            resolve(convert_csv_to_json());    // returns data in a json string
        })    
    })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...