2017-03-28 201 views
0

我有此方法fallbackToLocalDBfileOrLocalStorageDB其返回一個承諾和調用另一個方法getDBfileXHR這也是一個承諾。嵌套承諾打字稿角2

在這段代碼中,我想知道它,我必須使用'resolve()'或者如果解析getDBfileXHR會自動解決fallbackToLocalDBfileOrLocalStorageDB

正如你可以看到我的評論部分then().catch(),但我不知道如果我不得不離開它們。

感謝您的幫助。

fallbackToLocalDBfileOrLocalStorageDB() { 
     return new Promise(function (resolve, reject) { 
      if (this.storageService.get('prodata') === null) { 
       if (this.connectionStatus.f() !== 'online') { 
       } else { 
        this.sendErrorEmail("BL: online but falling back to local proDB", 10); 
       } 
       console.log('...falling back to local proBD.jsonp.'); 
       return this.getDBfileXHR('proDB.jsonp'); 
        // .then(function() { 
        // console.log('...falling back to local proBD.jsonp succeeded.'); 
        // resolve(); 
        // }) 
        // .catch(, function() { 
        // console.log('...error, shit.'); 
        // reject(); 
        // }); 

EDIT表示完全嵌套的功能,具有部分固定的代碼:

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

export class UpdateProDB { 

    constructor(
     ) { 
    } 


    get() { 
     var debugOptionUseLocalDB = 0, 
     prodata = [], 
     serverAttempts = 0;  return new Promise((resolve, reject) => { 
      if (debugOptionUseLocalDB) { 
       return this.fallbackToLocalDBfileOrLocalStorageDB(); 
      } 
      if (this.connectionStatus.f() === 'online') { 
       console.log("Fetching DB from the server:"); 
       return this.getDBfileXHR(this.dbUrl(), serverAttempts) 
       .then(function (data) { 
        console.log('-normal XHR request succeeded.'); 

        resolve(data); 
       }) 
       .catch((reason)=> { 
        if (typeof serverAttempts !== "undefined") serverAttempts++; 
        console.log('on passe dans le catch, serverAttempts = ', serverAttempts) 
        if (serverAttempts < 2) { 
         return this.getDBfileXHR(this.dbUrl(), serverAttempts) 
         .then(function() { 
          console.log('-basic XHR request succeeded.'); 

         }) 
         .catch(function(){ 
          console.log("-basic XHR request failed, falling back to local DB file or localStorage DB..."); 

         }) 
        } else { 
         console.log("-basic XHR request failed, falling back to local DB file or localStorage DB..."); 
         return this.fallbackToLocalDBfileOrLocalStorageDB() 
         .then((data)=>{ 
          resolve(data); 
         }) 
         .catch((reason)=> { 
          reject(reason); 
         }); 
        } 
       }); 
      }); 
    } 

    getDBfileXHR(url, serverAttempts) { 
     return new Promise((resolve, reject) => { 
      var request = new XMLHttpRequest(); 
      request.open("GET", url, true);    
      request.onload =()=> { 
       if ((request.readyState === 4) && ((request.status >= 200 && request.status <= 299) || request.status === 304 || request.status === 0)) { 
        console.log('-we get response '+request.status+' from XHR in getDBfileXHR'); 

        var jsonText = request.responseText.replace("callback(", "").replace(");", ""); 

        if (jsonText === '') { 
         console.error('-error'); 

         reject({ 
          status: request.status, 
          statusText: request.statusText 
         }); 

        } else { 
         var parsedJson; 
         try { 
          parsedJson = JSON.parse(jsonText); 
         } catch (e) { 
          resolve(request.response); 
         } 
        } 
       }; 
       request.onerror =()=> { 
        reject({ 
         status: request.status, 
         statusText: request.statusText 
        }); 
       }; 
       console.log("sending request.send()"); 
       request.send(); 

      }); 
    } 


    fallbackToLocalDBfileOrLocalStorageDB() { 
     return new Promise((resolve, reject) => { 
      if (this.storageService.get('prodata') === null) { 
       if (this.connectionStatus.f() !== 'online') { 

       } else { 
        this.sendErrorEmail("BL: online but falling back to local proDB", 10); 
       } 
       console.log('...falling back to local proBD.jsonp.'); 
       return this.getDBfileXHR('proDB.jsonp', undefined) 
       .then(function (data) { 
        console.log('...falling back to local proBD.jsonp succeeded.'); 
        resolve(data); 
       }) 
       .catch((reason)=> { 
        console.log('...error, shit.'); 
        reject(reason); 
       }); 
      } else { 
       resolve(); 
      } 
     }); 
    } 

回答

1

new Promise()的參數被稱爲執行程序功能。它需要resolve()reject()的承諾。

你要做的是從該執行器函數中返回另一個Promise。根據MDN,「執行者的回報值被忽略。」

這意味着你想的方式來使用這個內部Promise將無法​​正常工作,你必須明確解決或者拒絕你是在爲你的註釋代碼做的事情。

+0

我部分固定的代碼都與你的答案..但我認爲我還不在那裏!你認爲什麼? – Louis

+0

它在做什麼?它沒有做什麼? –

+0

我甚至沒有運行它!我剛纔檢查了腳本錯誤;) – Louis

1

首次使用箭頭功能=>代替function保持this關鍵字:

fallbackToLocalDBfileOrLocalStorageDB() { 
     return new Promise((resolve, reject) => { 
      if (this.storageService.get('prodata') === null) { 
       if (this.connectionStatus.f() !== 'online') { 
       } else { 
        this.sendErrorEmail("BL: online but falling back to local proDB", 10); 
       } 
       console.log('...falling back to local proBD.jsonp.'); 
       return this.getDBfileXHR('proDB.jsonp'); 
         .then(function (data) { 
         console.log('...falling back to local proBD.jsonp succeeded.'); 
         resolve(data); 
        }) 
         .catch((reason)=> { 
         console.log('...error, shit.'); 
         reject(reason); 
         }); 

和鬱可訪問您喜歡這樣的數據:

fallbackToLocalDBfileOrLocalStorageDB().then((data)=>{ 
    console.log(data); 
}) 
+0

我部分固定的代碼(編輯問題)......但我現在還沒有,我認爲;)正如你可以看到我嵌套幾個諾言...... – Louis

+0

請分開你的邏輯,導致你的代碼是不可維護 –

+0

做什麼你的意思是@BougarfaouiElHoucine?你能給個例子嗎 ? – Louis