Javascript 异步承诺未获得正确的值
我真的认为您应该仔细阅读async/Wait。当您依靠一个异步操作的结果执行另一个异步操作时,它使代码更具可读性。下面是一些伪代码,以便让您继续:Javascript 异步承诺未获得正确的值,javascript,asynchronous,promise,Javascript,Asynchronous,Promise,我真的认为您应该仔细阅读async/Wait。当您依靠一个异步操作的结果执行另一个异步操作时,它使代码更具可读性。下面是一些伪代码,以便让您继续: async function getData() { let getProject = await axios.get('url', { auth: { username: 'username', password: ' ' } }) let projects =
async function getData() {
let getProject =
await axios.get('url', {
auth: {
username: 'username',
password: ' '
}
})
let projects = await getProject.data.value;
projects.map(project => {
let ItemAssignment =
axios.get(`url`, {
auth: {
username: 'username',
password: ' '
}
})
let values = await ItemAssignment.data.value
console.log(values)
})
console.log('pr', projects)
}
getData()
异步函数go(){
试一试{
const projects=等待getProjects();
projects.map(project=>{
const itemAssignments=等待asnycItemAssignment(项目);
常数展平=等待展平(itemAssignments);
原木(扁平);
}
}捕获(e){
console.error(e);//代码的一个问题是:
async function go() {
try {
const projects = await getProjects();
projects.map(project => {
const itemAssignments = await asnycItemAssignment(project);
const flattened = await flatten(itemAssignments);
console.log(flattened);
}
} catch (e) {
console.error(e); // One issue with your code is this:
for (let i = 0; i < res.length; i++) {
projects.push(res[i])
resolve(projects)
}
不过,主要的问题可能是您在此处何时以及如何调用resolve(finalArr)
:
return new Promise(function(resolve, reject) {
for (let i = 0; i < proj.length; i++) {
axios.get(`url`, {
auth: {
username: 'username',
password: ' '
}
}).then(function(response) {
//console.log(response.data.value)
finalArr.push(response.data.value)
})
.catch(function(error) {
console.log(error)
})
}
resolve(finalArr)
})
正如你所承认的,你的代码非常混乱,我同意其他的答案,你最好考虑切换到<代码>等待<代码> >代码>异步> <代码>语法。mes在一个循环中。我们可以修复这些问题,但不清楚asnycItemAssignment
函数在做什么。您在proj
中循环,但在proj
中没有使用元素。因此不清楚为什么要这样做。您正在调用resolve(finalArr)同步进行第二次axios异步调用。在解析asyncItemASsignment之前,您必须等待所有辅助axios调用完成。Chris的解决方案将引导您朝正确的方向前进。我应该使用此方法而不是asnycItemAssignment,还是将这两个承诺都替换为此方法?这只是一个简单的过程显示函数长度的方式。如果您将函数声明为“异步”,则根本不需要引用承诺。“异步”类“承诺”函数-只需从函数返回您需要的内容(本质上就是它的解析)如果您需要拒绝,您只需抛出一个错误-请看这里:我正在尝试,它看起来确实简单多了!谢谢!但是如果这种功能存在,为什么以及何时我们必须使用承诺?我不再使用承诺了,但是如果有人有一个好的用例,我很高兴听到。Wait/async几乎做了承诺的所有事情吗用一种更简单的方式?
for (let i = 0; i < res.length; i++) {
projects.push(res[i])
}
console.log(projects)
resolve(projects)
return new Promise(function(resolve, reject) {
for (let i = 0; i < proj.length; i++) {
axios.get(`url`, {
auth: {
username: 'username',
password: ' '
}
}).then(function(response) {
//console.log(response.data.value)
finalArr.push(response.data.value)
})
.catch(function(error) {
console.log(error)
})
}
resolve(finalArr)
})
function asnycItemAssignment() {
for (let i = 0; i < proj.length; i++) {
finalArr.push(
axios.get(`url`, {
auth: {
username: 'username',
password: ' '
}
}).then(function(response) {
return response.data.value
})
)
}
return Promise.all(finalArr).catch(function(error) { console.log(error) })
}