如果对象的某个属性需要 promise 的值,如何创建对象



如何使用承诺的值将其添加到对象属性中?如果有人能帮助我,请欣赏它。

多拉尔.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是不够的;您仍然必须awaitPromise 才能使用它们的结果。

第一个问题是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,所以如果你想调用它,你必须使用awaitPromise 回调:

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来查看返回的值,因为myFuncasync,因此返回一个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);

最新更新