Node.js 导出的 Promise 链未与 Web API 回调按顺序运行

标签 node.js http promise callback node-modules

我有 2 个文件。一种 (get_data.js) 通过获取访问 token 从 API 获取数据,使用该 token 获取包含数据的 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))
    }
)

我想要发生的是

  • 运行 process_data.js
  • 它从 get_data.js 获取数据
  • 将该数据打印到控制台(暂时)

但是,在 get_data.js 中的第一个 API 回调中,process_data.js 中的 promise 链继续移动并打印“未定义”,我不确定为什么它不等待来自 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 中,您当前没有返回任何内容。这就是为什么错误是 TypeError: Cannot read property 'then' of undefined 因为不返回任何内容都会返回 undefined

为了在 dataHandler.getData() 上执行.then,您需要返回第一个新 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
        })    
    })
}

关于Node.js 导出的 Promise 链未与 Web API 回调按顺序运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60299408/

相关文章:

java.io.EOFException : Unexpected end of ZLIB input stream - reading from HTTP

javascript - 终止 Node.js 服务器请求的正确方法是什么?

javascript - 访问 Promise 对象 Angular 的值

Javascript then() 链接 - 第二个 then() 对应哪个 Deferred?

javascript - Node JS : Emoji in utf8 request returning � characters

node.js - Openzeppelin 中已为 Context.sol 声明了标识符

javascript - 如何向 javascript 数组添加新的复杂条目?

python - 使用 python 获取 http 响应代码

javascript - 对数据库和服务器使用 Promise

node.js - Node.js 有没有办法将数据库结果异步推送到客户端?