Gue*_*rs4 5 javascript arrays api object axios
我从 API 获取一个对象,并在其中使用其他 API 响应创建新对象,例如:
API响应1:Obj: {a: 1, b: 2}
API响应2:3
创建对象:Obj.c = 3
最终结果: 对象:{a: 1, b: 2, c: 3}
console.log(Obj) return Obj: {a: 1, b: 2, c: 3}
console.log(Obj.c) return undefined
Run Code Online (Sandbox Code Playgroud)
console.log当我尝试在属性中给出 a之后时,我没有得到.map,我无法访问创建的属性,返回undefined。但是,当我console.log在任何对象上给出 a 时,创建的属性就在那里。
async getGeneralInfo(token, seed) {
try {
API_HEADER.headers.Authorization = token;
let responseAvaliableCoins = await axios.get(
BASE_URL + "/coin",
API_HEADER
);
let avaliableCoins = responseAvaliableCoins.data.data.coins;
avaliableCoins.map(async (coin, index) => {
if (coin.status === "active") {
let responseCreateAddress = await axios.post(
BASE_URL + "/coin/" + coin.abbreviation + "/address",
{ seed },
API_HEADER
);
avaliableCoins[index].address =
responseCreateAddress.data.data.address;
let responseBalance = await axios.get(
BASE_URL +
"/coin/" +
coin.abbreviation +
"/balance/" +
coin.address,
API_HEADER
);
avaliableCoins.token = responseBalance.headers[HEADER_RESPONSE];
avaliableCoins[index].balance = responseBalance.data.data;
} else {
avaliableCoins[index].address = undefined;
avaliableCoins[index].balance = undefined;
}
});
console.warn(avaliableCoins[0].balance); //undefined
console.warn(avaliableCoins[0]["balance"]); //undefined
console.warn(avaliableCoins[0].address); //undefined
console.warn(avaliableCoins[0]["address"]); //undefined
console.warn("avaliableCoins", avaliableCoins); //All objects are here
console.warn("avaliableCoins[0]", avaliableCoins[0]); //All objects are here
return avaliableCoins;
} catch (error) {
internalServerError();
return;
}
}
Run Code Online (Sandbox Code Playgroud)
中使用的函数map是异步的。
现在map正在对所有硬币进行调用,并且在所有异步数据返回之前,代码已经转移到调用console.warn()。
availableCoins最终将在返回时使用所有异步数据进行更新,但这里存在竞争条件,因为代码没有显式等待这种情况发生。
这是推荐的方法:
async从每次调用中返回一个修改的项目map,这将返回一个在函数完成Promise时解析为修改的项目的项目async。Promise.all()等待数组Promises这是演示该方法的简化版本:
const getData = () => {
return Promise.resolve('data');
}
export const getGeneralInfo = async () => {
let avaliableCoins = [
{ a: 1 },
{ a: 2 }
]
const promises = avaliableCoins.map(async (coin) => {
let response = await getData();
// modify coin and return it
coin.data = response;
return coin;
});
const updatedCoins = await Promise.all(promises);
console.log(updatedCoins); // [{a: 1, data: 'data'}, {a: 2, data: 'data'}]
return updatedCoins;
}
Run Code Online (Sandbox Code Playgroud)
您修改后的函数将如下所示:
async getGeneralInfo(token, seed) {
try {
API_HEADER.headers.Authorization = token;
let responseAvaliableCoins = await axios.get(
BASE_URL + "/coin",
API_HEADER
);
let avaliableCoins = responseAvaliableCoins.data.data.coins;
const promises = avaliableCoins.map(async (coin) => {
if (coin.status === "active") {
let responseCreateAddress = await axios.post(
BASE_URL + "/coin/" + coin.abbreviation + "/address",
{ seed },
API_HEADER
);
coin.address =
responseCreateAddress.data.data.address;
let responseBalance = await axios.get(
BASE_URL +
"/coin/" +
coin.abbreviation +
"/balance/" +
coin.address,
API_HEADER
);
coin.token = responseBalance.headers[HEADER_RESPONSE];
coin.balance = responseBalance.data.data;
} else {
coin.address = undefined;
coin.balance = undefined;
}
return coin;
});
availableCoins = await Promise.all(promises);
console.warn(avaliableCoins[0].balance); //undefined
console.warn(avaliableCoins[0]["balance"]); //undefined
console.warn(avaliableCoins[0].address); //undefined
console.warn(avaliableCoins[0]["address"]); //undefined
console.warn("avaliableCoins", avaliableCoins); //All objects are here
console.warn("avaliableCoins[0]", avaliableCoins[0]); //All objects are here
return avaliableCoins;
} catch (error) {
internalServerError();
return;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18295 次 |
| 最近记录: |