Angular .map和.subscribe产生有趣的数组?

时间:2018-02-08 13:30:42

标签: javascript angular dictionary rxjs subscribe

无法弄清楚以下行为。也不记得曾经遇到类似的事情。我不得不承认我是角度和RxJS的新手,但是嘿!

this.service.getAll().map( r => {
    console.log(r)         // Array of 40 elements. Fine.
    console.log(r.length)  // Says "0"!
    return r.map( x => x)  // What happens here?
}).subscribe( r => {
    console.log([])        // That's what an empty array looks like.
    console.log(r)         // Empty!
})

1)为什么可行数组的长度为零? 2)为什么array.map(x => x)会沉没我亲爱的数组元素?

急切等待提示。

2 个答案:

答案 0 :(得分:0)

.map是一个在observables上用来转换数据的运算符,它也返回一个observable。

  1. 我不确定您在控制台中输出的数组是否包含在某个键下...如果它的长度为0,那么它肯定不是数组。您可能需要仔细观察。

  2. 您可能会尝试在响应中使用.json(),这可能会为您提供您期望的实际响应。

  3. r.map( x => x)在这里没有做任何事情。它是Array.map,它返回元素而不修改它。

  4. 在您的情况下,您不需要在observable上使用.map(),而是可以这样做:

    this.service.getAll()
      .subscribe( r => {
         console.log(r);
         // See how r looks like here       
      })
    

答案 1 :(得分:0)

行。原问题中的代码很好。我提到的奇怪效果是由我的服务类中的(可能)错误构造引起的,看起来像这样:

getAll(): Observable<MyObject[]> {

    let o$ = this.http.post("serviceURL/getAll", "{}")
    let newArr = []
    o$.subscribe( r => {

        let arr = r["payload"]  // taking what's of interest

        // now create objects not directly conforming to json
        for(let i = 0; i < arr.length; i++) {
            let json = arr[i]
            let newObject = new MyObject()
            newObject.parseAndStuff(json)
            newArray.push(newObject)
        }
    })
    // Didn't know how to apply the correct rx operators.
    return of(newArr)
}

注意在函数作用域中创建新数组并返回其可观察对象,并在闭包中向其添加对象的方法。如果你不像我在原帖中所做的那样触摸事物,这似乎可以工作一次(或更多?)。

尽管如此,我无法解释有趣的行为,但解决了它。随意解释一下!欢呼声。