管道中的 Axios HTTP 调用无需嵌套
Axios HTTP calls in pipeline without nesting
作为 Node.js 后端初始化的一部分,我需要对外部 API 执行大量 HTTP 调用(从外部 API 收集数据并初始化本地数据).
理想情况下是这样的
function callOne() {...}
function callTwo(input) {...}
function callThree(input) {...}
result1 = callOne();
result2 = callTwo(result1);
result3 = callThree(result2);
每一步都分开。
嵌套 .then() 的直接解决方案保证了管道顺序,但对我来说不是很好(可读性差,难以调试,每一步 .catch() 的错误管理复杂.. .).
我试着遵循 async/await 模式,像这样:
...
function async callOne() {
const promise = await axios.get(url1);
return promise.data;
}
function async callTwo(params) {
const promise = await axios.get(url2,params);
return promise.data;
}
function async callThree(data) {
const promise = await axios.get(url3,params);
return promise.data;
}
result1 = callOne();
result2 = callTwo(result1);
result3 = callThree(result2);
console.log(result3);
...
但不知何故不起作用(.data 是在未决的 Promise 上指定的,这导致“属性 of undefined object”)。上面的例子有什么问题?
如果 await 仍然是 returns 待处理的 Promise,它的目的是什么?
我怎么能让函数实际返回最终值?
--托马斯
每个async
函数总是returns一个Promise
。由于在调用这三个函数时不使用await
或.then()
,因此它们不会相互等待。你应该这样做:
async function callApi(){
const result1 = await axios.get(url1)
const result2 = await axios.get(url2, result1.data)
const result3 = await axios.get(url3, result2.data)
}
如果您想保留这些功能,同样的事情也适用。
result1 = await callOne();
result2 = await callTwo(result1);
result3 = await callThree(result2);
请记住:要使用 await
关键字,您需要在标记为 async
.
的函数内
作为 Node.js 后端初始化的一部分,我需要对外部 API 执行大量 HTTP 调用(从外部 API 收集数据并初始化本地数据). 理想情况下是这样的
function callOne() {...}
function callTwo(input) {...}
function callThree(input) {...}
result1 = callOne();
result2 = callTwo(result1);
result3 = callThree(result2);
每一步都分开。
嵌套 .then() 的直接解决方案保证了管道顺序,但对我来说不是很好(可读性差,难以调试,每一步 .catch() 的错误管理复杂.. .). 我试着遵循 async/await 模式,像这样:
...
function async callOne() {
const promise = await axios.get(url1);
return promise.data;
}
function async callTwo(params) {
const promise = await axios.get(url2,params);
return promise.data;
}
function async callThree(data) {
const promise = await axios.get(url3,params);
return promise.data;
}
result1 = callOne();
result2 = callTwo(result1);
result3 = callThree(result2);
console.log(result3);
...
但不知何故不起作用(.data 是在未决的 Promise 上指定的,这导致“属性 of undefined object”)。上面的例子有什么问题? 如果 await 仍然是 returns 待处理的 Promise,它的目的是什么? 我怎么能让函数实际返回最终值?
--托马斯
每个async
函数总是returns一个Promise
。由于在调用这三个函数时不使用await
或.then()
,因此它们不会相互等待。你应该这样做:
async function callApi(){
const result1 = await axios.get(url1)
const result2 = await axios.get(url2, result1.data)
const result3 = await axios.get(url3, result2.data)
}
如果您想保留这些功能,同样的事情也适用。
result1 = await callOne();
result2 = await callTwo(result1);
result3 = await callThree(result2);
请记住:要使用 await
关键字,您需要在标记为 async
.