管道中的 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.

的函数内