如何让一个单独的同步函数等待另一个异步函数?

How to make a separate a sync function wait for another async function?

我无法在另一个异步函数中回调异步函数。 我在控制台收到这个:

Promise {<pending>}
__proto__: Promise
[[PromiseState]]: "fulfilled"
[[PromiseResult]]: Object

script.js:127 TypeError: Cannot read property 'aWeatherObjProperty' of undefined
  at callForecastAPI (script.js:121)
  at HTMLInputElement.<anonymous> (script.js:138)

这是我的 JavaScript 代码:

function processSearchInput(searchInput) {
  // does some math. No waiting required.
  return processedSearchInput;
}
// processedSearchInput is an object

// Take processedSearchInput and call OpenWeather API
async function callWeatherAPI(processedSearchInput) {
  const response = await fetch(`calling API`, { mode: 'cors' });
  const weather = await response.json();
  return weather;
}
// weather is an object

// Call OpenWeather Forecast API and return weatherForecast object
async function callForecastAPI(weatherObj) {
  const response = await fetch(`calling API`);
  const weatherForecast = await response.json();
  return weatherForecast;
}

callForecastAPI(callWeatherAPI(processSearchInput(searchInput)));

我确定天气对象正在被 callWeatherAPI return 编辑,因为我可以 console.log 它就在 return 之前并且可以 return 它就在获取之前调用 ForecasrAPI。 预先感谢您的任何建议。

如果您尝试调用 callWeatherAPI() 并将其实际结果传递给另一个函数,那么您必须 await 它。它是一个 async 函数和所有 async 函数 return 一个承诺。 async 函数中的 return 值成为承诺的解析值。因此,要从承诺中获取价值,您可以使用 await.then().

callForecastAPI(await callWeatherAPI(processSearchInput(searchInput)));

当然,这意味着此代码本身需要在 async 函数中,以便您可以使用 await.

有关 async 如何始终 return 承诺的更多信息,请参阅

并且,callForecastAPI() 也是 async,也是 return 的承诺,因此要获得实际的预测结果,您需要使用 await.then() 也是如此。

const forecast = await callForecastAPI(await callWeatherAPI(processSearchInput(searchInput)));

或者,也许用一个中间变量更清楚:

const weather = await callWeatherAPI(processSearchInput(searchInput));
const forecast = await callForecastAPI(weather);
console.log(forecast);