【问题标题】:Variable Retains Original Value Despite Having New Value Earlier and Further within a Function尽管在函数中更早或更远地具有新值,但变量仍保留原始值
【发布时间】:2018-11-02 22:10:46
【问题描述】:
let getProjects = function() {
  try {
    return axios.get('https://app.asana.com/api/1.0/projects/')
  } catch (error) {
    console.error(error)
  }
}

let getTasks = function(project) {
  try {
    return axios.get('https://app.asana.com/api/1.0/projects/'+project+'/tasks')
  } catch (error) {
    console.error(error)
  }
}

async function getAsanaData() {
    let projects = await getProjects()
    projects = projects.data.data
    projects.map(async (project) => {
        //project.attachments = []
        let tasks = await getTasks(project.gid)
        if(tasks != undefined){
          tasks = tasks.data.data 
          project.tasks = tasks
          //console.log(projects)
        }
    })
    console.log(projects)
    return projects
}

Promise.try(() => {    
  return getAsanaData();
}).then((result) => {
  //console.log(util.inspect(result, {showHidden: false, depth: null}))
  //var asanaData = safeJsonStringify(result);
  //fs.writeFile("thing.json", asanaData);
})
.catch(err=>console.log(err))

getAsanaData() 中,projectsproject.tasks = tasks 之后有一个新值。

但是,它的原始值是由console.log(projects)return projects 之前打印的。

这当然也意味着将返回原始值而不是必要的新值。

这是什么原因,我该如何解决?

【问题讨论】:

  • Array.map() 返回一个新数组,它不会就地修改它。
  • 你什么时候看日志?由于您正在更新对象,每次循环,并且控制台包含对该对象的实时引用,它会根据您展开它的时间而改变。
  • @Barmar project.tasks = tasks 之后的日志表明项目添加了任务数组。返回之前的日志以及后来编写的 JSON 文件显示没有添加任务数组的项目。
  • @pmkro 所以现在如果我将 projects = 设置为新数组,然后尝试返回项目,我只会得到未决的承诺。

标签: javascript node.js scope async-await axios


【解决方案1】:

试试这个:

async function getAsanaData() {
    let projects = await getProjects()
    return Promise.all(projects.data.data.map(async (project) => {
        let tasks = await getTasks(project.gid)
        project.tasks = !!tasks ? tasks.data.data : project.tasks            
        return project
    }))
}

这将通过对getTasks 的异步调用并为每个项目返回。然后你应该通过Promise.all

解决所有问题

【讨论】:

    猜你喜欢
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 2017-02-15
    • 2021-02-05
    相关资源
    最近更新 更多