2017-01-17 13 views
0

js関数から拒否された約束を返す必要があります。私はあなたが見ることができるように角度$ qを使用しています。しかし、それは動作しません。機能getDBfileXHRで ファンクションが返された約束を返すときエラーケースに渡る

、約束getDBfileXHRdeferred機能getDBfileXHRのエラーケースに入るとfallbackToLocalDBfileOrLocalStorageDBを実行するために、私はだろうgetDBfileXHRdeferred.reject()を使用して拒否されます()。しかし、それは動作しません。

構文エラーがありますか? 私は約束を少し新しくしています。

おかげ

this.get = function() { 
    var debugOptionUseLocalDB = 0, 
    prodata = [], 
    serverAttempts = 0; 

    if (debugOptionUseLocalDB) { 
     return fallbackToLocalDBfileOrLocalStorageDB(); 
    } 
    if (connectionStatus.f() === 'online') { 
     console.log("Fetching DB from the server:"); 
     return getDBfileXHR(dbUrl(), serverAttempts) 
     .then(function() { // success 
      console.log('-basic XHR request succeeded.'); 
      return dbReadyDeferred.promise; 
     }, function() { // error 
      console.log("-basic XHR request failed, falling back to local DB file or localStorage DB..."); 
      return fallbackToLocalDBfileOrLocalStorageDB(); 
     }); 
     } 

} 

function getDBfileXHR(url, serverAttempts) { 
    var getDBfileXHRdeferred = $q.defer(), 
    request = new XMLHttpRequest(); 
    if (typeof serverAttempts !== "undefined") serverAttempts++; 
    request.open("GET", url, true); //3rd parameter is sync/async 
    request.timeout = 2000; 
    request.onreadystatechange = function() {  // Call a function when the state changes. 
     if ((request.readyState === 4) && (request.status === 200 || 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 : request.status = ' + request.status + ', but jsonText is empty for url=' + url); 
       if (serverAttempts <= 2){ 
        sendErrorEmail("BL: jsonText is empty, trying to reach server another time", 11); 
        getDBfileXHR(url, serverAttempts); 
        return; 
       } else { 
        sendErrorEmail("BL: jsonText is empty and attempted to reach server more than twice", 14); 
        var alertPopup = $ionicPopup.alert({ 
         title: 'Error '+"11, jsonText is empty", 
         template: "Sorry for the inconvenience, a warning email has been sent to the developpers, the app is going to restart.", 
         buttons: [{ 
          text:'OK', 
          type: 'button-light' 
         }] 
        }); 

        getDBfileXHRdeferred.reject(); 
       } 
      } else { 

      } 
     } else { 
      console.error('-error, onreadystatechange gives : request.status = ' + request.status); 
      getDBfileXHRdeferred.reject(); 
     } 
    }; 
    if (url === "proDB.jsonp") { 
     console.log("-Asking local proDB.json..."); 
    } else { 
     console.log("-Sending XMLHttpRequest..."); 
    } 

    request.send(); 
    return getDBfileXHRdeferred.promise; 
} 

EDIT: 私はこのapproachを使用して、私の機能を書き直しました。このようにきれいになっているようです。しかし今、あなたは私が複数のattempdsを扱うのを手助けすることができますか?

function getDBfileXHR(url, serverAttempts) { 
    return new Promise(function (resolve, reject) { 
     var request = new XMLHttpRequest(); 

     request.open("GET", url, true);       request.timeout = 2000; 
     var rejectdum; 
     if (url === "proDB.jsonp") { 
      console.log("-Asking local proDB.json..."); 
     } else { 
      console.log("-Sending XMLHttpRequest..."); 
     } 
     request.onload = function() { 
      if ((request.readyState === 4) && (request.status === 200 || 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 : request.status = ' + request.status + ', but jsonText is empty for url=' + url); 
        sendErrorEmail("BL: jsonText is empty, trying to reach server another time", 11); 
        sendErrorEmail("BL: jsonText is empty and attempted to reach server more than twice", 14); 
        var alertPopup = $ionicPopup.alert({ 
         title: 'Error '+"11, jsonText is empty", 
         template: "The surfboard database could not be updated, you won't see the new models in the list, sorry for the inconvenience.", 
         buttons: [{ 
          text:'OK', 
          type: 'button-light' 
         }] 
        }); 
        console.log('oui on passe rejectdum') 
        rejectdum = 1; 
        reject({ 
         status: this.status, 
         statusText: request.statusText 
        }); 

       } else { 
        var parsedJson; 
        try { 
         parsedJson = JSON.parse(jsonText); 
        } catch (e) { 
         console.warn("Problem when trying to JSON.parse(jsonText) : "); 
         console.warn(e); 
         console.warn("parsedJson :"); 
         console.warn(parsedJson); 

        } 
        if (parsedJson) { 
         var prodata = jsonToVarProdata(parsedJson); 



         console.log('-writing new prodata to localStorage');        
         console.log('last line of prodata:' + prodata[prodata-1]); 
         storageService.persist('prodata', prodata); 
         storageService.store('gotANewDB', 1); 
        } 
        resolve(request.response); 
        dbReadyDeferred.resolve(); 
       } 
      } 
     }; 
     request.onerror = function() { 
      reject({ 
       status: this.status, 
       statusText: request.statusText 
      }); 
     }; 

     request.send(); 

    }); 
} 

は、それはいくつかの試みを行うにこれを行うにはきれいな方法です:(?2回)再試行するコードを削除する場合

return getDBfileXHR(dbUrl(), serverAttempts) 
.then(function() { // success 
    console.log('-basic XHR request succeeded.'); 
    return dbReadyDeferred.promise; 
}) 
.catch(function(){ 
    if (typeof serverAttempts !== "undefined") serverAttempts++; 
    console.log('on passe dans le catch, serverAttempts = ', serverAttempts) 
    if (serverAttempts < 2) { 
     return getDBfileXHR(dbUrl(), serverAttempts) 
     .then(function() { // success 
      console.log('-basic XHR request succeeded.'); 
      return dbReadyDeferred.promise; 
     }) 
     .catch(function(){ 
      console.log("-basic XHR request failed, falling back to local DB file or localStorage DB..."); 
      return fallbackToLocalDBfileOrLocalStorageDB(); 
     }) 
    } else { 
     console.log("-basic XHR request failed, falling back to local DB file or localStorage DB..."); 
     return fallbackToLocalDBfileOrLocalStorageDB(); 
    } 
}) 
+0

.reject()ステートメントが呼び出されていますか? –

+0

はい、 '.reject()'メソッドが実行されていることを確認してください。また、いくつかの簡単な観察:1. 'getDBfileXHRdeferred.resolve();'の呼び出しが表示されないので、空の 'else'節でそれをしたいと思います。 2.試行を繰り返すときは 'return getDBfileXHR(url、serverAttempts);'を返すべきです。そうでなければ、後続のリクエストの結果を返すことはありません。 – GPicazo

+0

私は 'jsonText = '';'の直前に '{(jsonText === ''){' を入れようとしたため、約束が拒否され、エラーの場合は実行されないと確信しています。 () 'の場合は、簡単にするためにコードから削除しました。 これを繰り返していただきありがとうございました。私はこれをコード化する方法がわかりませんでした。私は今これを修正しているので、 'getDBfileXHR(url、serverAttempts);を置き換えるべきです。 return get; 'return getDBfileXHR(url、serverAttempts);'そうですか?私は 'var getDBfileXHRdeferred = $ q.defer()'をgetDBfileXHR関数の中で宣言しているので、毎回リセットされるので、 – Louis

答えて

0

を失敗した場合にあなたのコードは、おそらくうまくいく(見ていません -

問題は、あなたの呼び出しコードが取得する唯一の約束は、最初の試行のそれです。約束は(1)に解決されるのであれば、

if (serverAttempts <= 2){ 
    sendErrorEmail("BL: jsonText is empty, trying to reach server another time", 11); 
    getDBfileXHRdeferred.resolve(getDBfileXHR(url, serverAttempts)); 
    return; 
} else { 

のようなものをそう - 最初の試みが失敗した場合は、その約束が解決しないか、

を拒否したんあなたはgetDBfileXHR(url, serverAttempts);によって返された約束と約束を解決する必要があります拒否された約束(2)、結果はその約束である(1)約束の拒絶値を拒否する(2)

これはどのようにネイティブの約束であり、多くの多くの約束/ A +に準拠したライブラリが動作し、 ので、この必要がありますの場合Promise/A +仕様に従っている場合

関連する問題