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))
}
)
我想要发生的是
- 运行 process_data.js
- 它从 get_data.js
获取数据
- 将该数据打印到控制台(暂时)
然而,在 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
。
为了 .then
在 dataHandler.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
})
})
}
我有 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))
}
)
我想要发生的是
- 运行 process_data.js
- 它从 get_data.js 获取数据
- 将该数据打印到控制台(暂时)
然而,在 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
。
为了 .then
在 dataHandler.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
})
})
}