gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:48:04 25 4
gpt4 key购买 nike

我有 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com