2017-03-09 66 views
0

我需要搜索大型JSON文件中的id并返回所有属性。但是,有一个parentId属性。这对应于另一个对象,其属性我需要包括的id,可能另一个parentId如何使用承诺继续运行

m.getAttrs = function(o){ 
    var a = [] 

    // get the model based on id or object.id 
    if(o instanceof String) 
     var obj = json.models.filter(i => i.id == o)[0] 
    else 
     var obj = json.models.filter(i => i.id == o.id)[0] 

    ////// On 2nd iteration: "TypeError: Cannot read property 'hasOwnProperty' of undefined" /////////////// 
    if(obj.hasOwnProperty("parentId") && obj.parentId != ""){ 
     // get parent id 
     var pid = obj.parentId 

     // get parent attributes 
     a.push(m.getAttrs(pid)) // RECURSION // 
    } 

    // get attributes 
    var attrs = obj.attrids 

    // get Attribute Names 
    for(aid in attrs){ 
     var aName = json.attrs.filter(i => i.id == aid) 
     a.push(aName) 
    } 

    return a 
} 

我看到一个错误其中obj不getAttrs的第一次迭代后定义。我认为这是因为json.models.filter...没有完成,但它可能是很多事情。

我已经尝试了许多次实现承诺,但似乎无法获得任何工作,并且它使我的代码太杂乱,因此无法将其包含在此处。

我如何能实现一个承诺,说:“你找到合适的型号后,CONTINUE(而不是执行其它功能)”?

+2

什么是'json.models'?如果它只是一个数组,那么在下一行代码运行之前就完成了('Array.prototype.filter'是同步的)。 –

+0

'json.models'它是一个对象数组。很高兴知道'.filter'是同步的 - 谢谢。所以你说的问题不是异步,它可能与过滤器? –

+0

如果'json.models'是一个数组,你绝对不会得到'TypeError:无法从上面指出的行读取'undefined'属性'hasOwnProperty'。 'obj'将是一个数组(肯定),它具有'hasOwnProperty'。 –

回答

0

这里是我发现了什么......

  • 据Jamiec,这是不可能使用一个承诺,继续正常运行。虽然看起来像generator也许能够完成这一点,但我并不熟悉它们。
  • Array.prototype.filter是同步的,所以我的问题不是与异步首先。事实证明,instanceof String不起作用,除非你专门做一个字符串变量。这里有一个帖子,我发现,以帮助是:Why does instanceof return false for some literals?

这个固定我的代码:

if(typeof o === "string") 
    var obj = json.models.filter(i => i.id == o)[0] 
else 
    var obj = json.models.filter(i => i.id == o.id)[0] 
+0

我没有说它不可能,我说它不是*明智的* – Jamiec