2017-05-15 45 views
0

我想填充數組zvols,其中包含zvols列表的路徑的名稱。問題是我得到一個空數組成功獲取電話後,使用.push方法後typescript數組爲空爲空

import { Injectable } from '@angular/core'; 

import { Http } from '@angular/http'; 
import 'rxjs/add/operator/map'; 
import { Observable, Subject, Subscription } from 'rxjs/Rx'; 
import { EntityUtils } from '../pages/common/entity/utils' 
import { RestService, WebSocketService } from '../services/'; 


@Injectable() 
export class VmService { 
    protected volume_resource_name: string = 'storage/volume' 

    constructor(protected rest: RestService){ 
    }; 

getStorageVolumes() { 
    let zvols: Array<any> = []; 
    this.rest.get(this.volume_resource_name , {}).subscribe((res) => { 
     let data = new EntityUtils().flattenData(res.data); 
     for (let zvol_obj of data){ 
      if (zvol_obj.type === 'zvol') { 
       zvols.push(zvol_obj.path); 
      } 
     } 
     console.log("BEFORE:" + zvols); 
    }); 
    console.log("AFTER:" + zvols); 
    return zvols; 
} 
} 

我可以看到控制檯打印

AFTER: 
main.bundle.js:744 Unknown message: Object {msg: "ready", subs: Array(1)} 
vm.service.ts:26 BEFORE:tank-a/ds-a/zvol-a,tank-b/ds-b/zvol-b 

我感到困惑的這種行爲。 :(

+0

你在控制檯看到的是AFTER是pr在之前之前。這意味着您的'BEFORE''console.log()'實際上是在回調函數中的'return zvols'之後調用的。你不能像這樣返回異步操作的結果。 – artem

+0

好的,請告訴我如何返回asnyc電話的結果? –

+0

你不能。你必須在回調中使用它。如何 - 這取決於你想要用它做什麼。你可以從'getStorageVolumes()'返回'get()'的結果,然後調用它的代碼應該執行'subscribe()'並在它提供給'subscribe()'的回調中使用結果。 – artem

回答

1

在您的代碼:

this.rest.get(this.volume_resource_name , {}).subscribe((res) => { 
    let data = new EntityUtils().flattenData(res.data); 
    for (let zvol_obj of data){ 
     if (zvol_obj.type === 'zvol') { 
      zvols.push(zvol_obj.path); 
     } 
    } 
    console.log("BEFORE:" + zvols); 
}); 
console.log("AFTER:" + zvols); 

AFTER執行之前BEFORE線這是異步編程的本質

學習異步編程

使用調試器和步進。通過代碼看它是如何工作的

+0

所以我在'this.rest.get(this.volume_resource_name,{})。之前加入了調試器。subscribe((res)=> {'我看到它直接進入'return zvols;'我在這裏丟失了什麼? –