如何使用承诺的值将其添加到对象属性中?如果有人能帮助我,请欣赏它。
多拉尔.js
const axios = require('axios');
const url ='https://s3.amazonaws.com/dolartoday/data.json';
async function getTasaDolar(priceBs) {
axios.get(url).then(function (response) {
return response.data.USD.transferencia;
}).catch(function(error) {
}).then(function(response) {{
console.log('--------');
console.log(priceBs/response);
return priceBs/response;
}});
}
module.exports = getTasaDolar;
对象.js
const getTasaDolar = require('./dolar.js');
async function myFunc ({name, brand, category, priceBs}) {
const object = {
name,
brand,
category,
priceBs,
priceDolar : getTasaDolar(priceBs)
}
return object;
}
const hola = myFunc({name:`hola`, brand: `Chocozuela`, category:`Carnes`, priceBs:645000});
console.log(hola);
当我运行它时,输出是:
Promise {
{ name: 'hola',
brand: 'Chocozuela',
category: 'Carnes',
priceBs: 645000,
priceDolar: Promise { undefined } } }
--------
3.467229680260142.
如您所见,值 3.46 是控制台的.log但是当我控制台时.log hola 对象的属性价格Dolar 是承诺 {未定义}
仅仅将函数声明为async
是不够的;您仍然必须await
Promise 才能使用它们的结果。
第一个问题是getTasaDolar
没有等待任何东西。要修复:
async function getTasaDolar(priceBs) {
const response = await axios.get(url);
return priceBs / response.data.USD.transferencia;
}
现在你还必须在myFunc
中等待这个:
async function myFunc ({name, brand, category, priceBs}) {
return {
name,
brand,
category,
priceBs,
priceDolar: await getTasaDolar(priceBs)
};
}
是的,异步性也冒泡到myFunc
,所以如果你想调用它,你必须使用await
或Promise 回调:
myFunc({name:`hola`, brand: `Chocozuela`, category:`Carnes`, priceBs:645000})
.then(hola => console.log(hola));
也许你有一个似乎常见的误解,认为创建一个函数async
告诉JavaScript自动等待异步的东西,但它的真正含义是你可以使用关键字await
,这是一种更方便的方式来调用.then(...)
,.catch(...)
和.finally(...)
Promise方法。
这里有2个问题: 1(getTasaDolar
返回undefined
,因为它没有显式返回任何内容 2(您在调用getTasaDolar
时不等待承诺解决
getTasaDolar
不需要async
,因为它不使用await
。也不需要catch
,因为无论谁调用它都可以处理。您正在使用导致响应未定义的错误。以下是我调整此功能的方法:
function getTasaDolar(priceBs) {
return axios
.get(url)
.then(function(response) {
const data = response.data.USD.transferencia;
console.log("--------");
console.log(priceBs / data);
return priceBs / data;
});
}
myFunc
函数最好async
,您应该await
第一个函数的结果。但是在调用myFunc
的位置必须使用.then
来查看返回的值,因为myFunc
async
,因此返回一个Promise
对象。
async function myFunc({ name, brand, category, priceBs }) {
const object = {
name,
brand,
category,
priceBs,
priceDolar: await getTasaDolar(priceBs) // <-- await here
};
return object;
}
myFunc({name:`hola`, brand: `Chocozuela`, category:`Carnes`,
priceBs:645000}).then(hola => console.log(hola);