2016-09-14 202 views
0

我很努力應付處理我的應用程序,這是寫在Angular2/ionic2本地存儲數據的異步檢索。鏈接承諾,以應付來自this.storage.get()調用異步承諾

我的代碼如下:

request(args) { 
 
    var headers = new Headers(); 
 
    headers.append('Content-Type', 'application/json'); 
 

 
    // Retrieve the token from the local storage, if available 
 
    this.storage.get('token').then((value) => { 
 
     headers.append('Authorization', 'Token ' + value); 
 
    }); 
 

 
    args = args || {}; 
 

 
    var url = this.API_URL + args.url; 
 
    var method = args.method; 
 
    var data = args.data || {}; 
 

 
    var options = new RequestOptions({headers: headers, withCredentials: this.use_session}); 
 

 
    return new Promise((resolve,reject) => { 
 

 
     if (method == 'GET') { 
 
     this.http.get(url, options) 
 
      .map(res => res.text()) 
 
      .subscribe(
 
      (data:any) => { 
 
       resolve(data); 
 
      }, 
 
      (err:any) => { 
 
       data = {}; 
 
       data['status'] = 0; 
 
       data['non_field_errors'] = ["Could not connect to server. Please try again."]; 
 
       data['error'] = err; 
 
       reject(); 
 
      }, 
 
      () => { 
 
      } 
 
     ); 
 
     } 
 
    }); 
 
    }

調用請求函數的代碼如下所示:

authenticationStatus(){ 
 
    return this.request({ 
 
     'method': "GET", 
 
     'url': "/user/" 
 
     }) 
 
     .then((data:any) => { 
 
      console.log('****** authenticationStatus: GET /user/ SUCCESS'); 
 
     }); 
 
    }

,這是又被稱爲是這樣的:

 this.djangoAuth.authenticationStatus() 
 
     .then((data:any) => { 
 
      this.loggedIn = true; 
 
      this.enableMenu(true); 
 
      this.root = PhotoPage; 
 
      }, 
 
      (err:any)=>{ 
 
      this.loggedIn = false; 
 
      this.enableMenu(false); 
 
      this.root = LoginPage; 
 
      });

我有困難的包裹我的頭周圍嵌套的承諾,不能工作了如何修改上面的代碼,以便this.storage.get("token")調用的結果在下面的代碼中使用之前已將數據添加到標題中。我認爲我需要以某種方式將承諾鏈接起來,但不能確切地說明如何。

+0

本地localStorage的訪問添加else部分是同步的......不知道爲什麼你的被包裹在承諾 – charlietfl

+1

這不是原生它是angularjs /離子 –

+0

這兩個框架都使用本機javascript – charlietfl

回答

1

是的,你需要鏈接兩個承諾 - 這實際上很簡單。你所要做的就是返回第二個承諾,從你傳遞給第一個承諾then()方法的回調中。

可以通過改寫這樣的代碼(我感動的是增加了標題,以單獨的函數的代碼 - 我認爲這是更具可讀性這種方式)

// returns a promise that resolves to headers 
createHeaders() { 
    var headers = new Headers(); 
    headers.append('Content-Type', 'application/json'); 

    // Retrieve the token from the local storage, if available 
    return this.storage.get('token').then((value) => { 
    headers.append('Authorization', 'Token ' + value); 
    return headers; 
    }); 
} 

request(args) { 

    return this.createHeaders().then(headers => { 
    args = args || {}; 

    var url = this.API_URL + args.url; 
    var method = args.method; 
    var data = args.data || {}; 

    var options = new RequestOptions({headers: headers, withCredentials: this.use_session}); 

    return new Promise((resolve,reject) => { 

     if (method == 'GET') { 
     this.http.get(url, options) 
      .map(res => res.text()) 
      .subscribe(
      (data:any) => { 
       resolve(data); 
      }, 
      (err:any) => { 
       data = {}; 
       data['status'] = 0; 
       data['non_field_errors'] = ["Could not connect to server. Please try again."]; 
       data['error'] = err; 
       reject(); 
      }, 
      () => { 
      } 
     ); 
     } 
    }); 
    }); 
} 

在這一切的最困難的事情就是令自己不要忘記每並且每個必需return

另外,我注意到,您的Promise會如果收到其他任何方法比GET永遠不會完成 - 你可能要與reject

if (method == 'GET') { 
    .... 
} else { 
    reject(new Error('invalid method:' + method)); 
} 
+0

似乎有一個問題參數的範圍。代碼落在使用args.url和args.method的行上。 –

+0

我使用Typescript以防有任何區別。 –

+0

是的,我忘了'這個'。調用createHeaders()時需要它,並且在回調中需要它(這就是爲什麼我將'function'改爲'=>')的原因。固定。 – artem