node.js 导出的承诺链未 运行 按顺序与网络 api 回调

node.js exported promise chain not running sequentially with web api callbacks

我有 2 个文件。一个 (get_data.js) 通过获取访问令牌从 API 获取数据,使用它来获取包含数据的 URL,然后从 URL 获取 csv 数据和将其转换为 JSON。 第二个文件(process_data.js)只是console.logs那个JSON数据。

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))
    }
)

我想要发生的是

然而,在 get_data.js 中的第一个 API 回调中,来自 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

getData 你目前没有 return 任何东西。这就是错误是 TypeError: Cannot read property 'then' of undefined 的原因,因为 return 什么都没有 return 是 undefined

为了 .thendataHandler.getData() 你需要 return 你的第一个 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
        })    
    })
}