如何使用promises继续运作

时间:2017-03-09 16:50:36

标签: javascript angularjs

我需要在一个大型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 (而不是执行其他功能)后实现承诺说&#34;&#34;?< / p>

1 个答案:

答案 0 :(得分:0)

这是我发现的......

  • 根据Jamiec的说法,无法使用承诺继续常规操作。虽然似乎generator可能能够实现这一点,但我对它们并不熟悉。
  • Array.prototype.filter是同步的,所以我的问题首先不是异步。事实证明,除非您专门创建一个String变量,否则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]