【问题标题】:Contradictory values when logging object and object.key side by side并排记录 object 和 object.key 时的矛盾值
【发布时间】:2016-01-25 18:51:38
【问题描述】:

我有两个 console.log 语句,一个接一个。第一个记录整个对象elem,第二个记录elem.hero。这是我得到的结果:

//console.dir(elem)
{ 
    project: {}, 
    hero: {
        path: "569f9dcbe4b0ea7fccac85b4/569f9dd5e4b060eb54c0dd7c",
        fileType:"png"
    }
}

//console.dir(elem.hero)
{ 
    path: "default",
    fileType:"jpg"        
}

这里的图片:

换句话说,检查elem 对象的 hero 属性给了我我的期望,但是直接将它的值记录到控制台给了我一个旧值。这里发生了什么?这是我的相关代码。

var projects = []

function getProjects() {
  return new Promise(function(resolve, reject){
    var url = "http://example.com/api/v2/projects"
    utils.sendAPIRequest(url, utils.generateToken(), function(err, data, xhr){
      if(err) {
        reject(Error(err))
      }
      else {
        for(var i in data) {
          projects.push({project: data[i], hero: { path: "default", fileType: "jpg"}})
        }
        resolve() 
      }      
    })
  })
}

function constructHeroURL(elem){
  return new Promise(function(resolve, reject){
    var url = 'http://example.com/api/v2/files?size=1&query=meta.image.ExecPortalArtistImage_1445947066011:Yes+AND+project._id:' + elem.project.id 
    utils.sendAPIRequest(url, utils.generateToken(), function(err, data, xhr){
      if(err) {
        reject(Error(err))
      }
      else {
        for(var i in data) {
          var id = data[i].id
          var fileID = data[i].revisions[0].preview[0].fileID
          var fileType = data[i].revisions[0].preview[0].name.split('.')
          elem.hero.path = id + '/' + fileID
          elem.hero.fileType = fileType[fileType.length-1]
        }
        resolve() 
      }      
    })    
  })
}

function getHeroImages(elem){
  return new Promise(function(resolve, reject){
    console.dir(elem) // logs in question
    console.dir(elem.hero) // on these lines
    var url = 'http://localhost:3000/media/' + elem.hero.path
    $.get(url)
    .done(function(data, status, xhr){
      resolve(data) 
    })
    .fail(function(xhr, status, err){
      reject(Error(err))   
    })    
  })  
}

getProjects()
.then(function(){
  return projects.map(constructHeroURL)
})
.then(function(){
  return projects.map(getHeroImages)
  .reduce(function(sequence, imagePromise) {
    // Use reduce to chain the promises together,
    // adding content to the page for each chapter
    return sequence.then(function() {
      // Wait for everything in the sequence so far,
      // then wait for this chapter to arrive.
      return imagePromise
    }).then(function(image) {
      console.log(image)
    })
  }, Promise.resolve())
})

【问题讨论】:

  • 你能把你的结果包装成问题而不是外部图像吗?我无法访问它(n/w 限制):(
  • @RayonDabre 绝对,一秒
  • 你有没有兑现承诺?一个接一个?我猜有被多次调用..
  • @RayonDabre 每个对象都被调用一次,每个console.log 语句只触发一次。让我包括我的链...
  • 你能告诉我们它们是如何执行/调用的吗?

标签: javascript arrays object promise


【解决方案1】:

我认为这是因为elem.hero 的属性有primitive types,但elem 的属性heroreference type

所以console.log(elem.hero); 的结果显示了它的属性值(原语),console.log(elem); 显示了对其属性hero 的引用,该属性在请求成功后更新。

【讨论】:

  • elem.hreo 是一个不是原始值类型的对象。
  • 是的,但似乎console.log 显示了一个对象的属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-27
  • 2016-11-24
  • 1970-01-01
  • 2022-12-04
  • 2013-07-01
  • 2011-02-03
相关资源
最近更新 更多