Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 异步承诺未获得正确的值_Javascript_Asynchronous_Promise - Fatal编程技术网

Javascript 异步承诺未获得正确的值

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/Wait。当您依靠一个异步操作的结果执行另一个异步操作时,它使代码更具可读性。下面是一些伪代码,以便让您继续:

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) })
}