Tengo una función que publica datos a través de una API. Quiero devolver la respuesta... Estoy siguiendo tutoriales en línea para tratar de entender async/await, y la forma en que lo tengo ahora me parece correcta.
Puedo imprimir dentro de la declaración postAsset.then, pero el valor de retorno siempre está indefinido. Eso es lo que pensé que esperaba arreglado, ¿no estoy seguro de por qué todavía no está definido en este caso?
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) }Porque está usando .then y no .then , lo await funcionaría si devolviera la promesa que recibió, pero no lo hace.
Solución 1:
Devuelve la promesa que obtienes de axios.post (agrega return delante):
return axios .post(...) .then(...)Solución 2 (mejor):
No mezcle .then con async / await , en su lugar solo use async / await :
try { const response = await axios.post(urlAssets, assetToPost, config) return response.assetId } catch (error) { console.log('POSTING ASSET ERROR:', error) return -1 } (Por cierto, cambié error.message a solo error para que no pierdas la información importante de la pila).
la función postAsset debe devolver una promesa, y dentro de la promesa debe ejecutar la llamada axios.post
Está devolviendo su assetId de la llamada axios pero no devolviendo nada del método postAsset .
Simplemente agregue la palabra clave de return antes de llamar a axios . Funcionará.
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 })