Javascript async/await return 值未定义,为什么?

Javascript async/await return value is undefined, why?

我有一个通过 API 发布数据的函数。我想要 return 响应...我正在按照在线教程尝试理解 async/await,我现在的布局方式对我来说似乎是正确的。

我可以在 postAsset.then 语句中打印,但 return 值始终未定义。这就是我认为 await 已解决的问题,不确定为什么在这种情况下它仍然未定义?

const postAsset = async (assetToPost) => {
    let token = await retrieveToken()

    if (token !== undefined && token !== 'Error') {
        const config = {
            headers: { Authorization: `Bearer ${token}` }
        };

        let urlAssets = `${API_ROUTE}${ASSETS.ASSETS_API_URL}`

        axios
            .post(urlAssets, assetToPost, config)
            .then(function (response) {
                let assetId = response.data
                return assetId
            })
            .catch(function (error) {
                console.log('POSTING ASSET ERROR: ', error.message);
                return -1
            })
    }
}

const postData = async () => {
        // post asset, get id response.
        // then post beacons in loop, get id response for each
        // then post a beaconId as part of assetId

        let assetId = await postAsset(asset)
        console.log(assetId)
}

因为您使用的是 .then 而不是 await - 如果您 return 得到了承诺,但您没有得到,这会起作用。

解决方案一:

Return 你从 axios.post 得到的承诺(在它前面加上 return):

return axios
    .post(...)
    .then(...)

方案二(较好):

不要将 .thenasync/await 混合使用,而是 使用 async/await:

try {
  const response = await axios.post(urlAssets, assetToPost, config)
  return response.assetId
} catch (error) {
  console.log('POSTING ASSET ERROR:', error)
  return -1
}

(顺便说一下,我把 error.message 改成了 error 这样你就不会丢失重要的堆栈信息!)

函数 postAsset 应该 return 一个承诺,并且在承诺中应该执行调用 axios.post

您正在从 axios 调用返回 assetId,但未从 postAsset 方法返回任何内容。
只需在 axios 调用之前添加 return 关键字。它会起作用。

    return axios
        .post(urlAssets, assetToPost, config)
        .then(function (response) {
            let assetId = response.data
            return assetId
        })
        .catch(function (error) {
            console.log('POSTING ASSET ERROR: ', error.message);
            return -1
        })