2017-01-17 1 views
0

js 함수에서 거부 된 약속을 반환해야합니다. 나는 당신이 볼 수 있듯이 $ q를 사용하고 있습니다. 그러나 그것은 효과가 없습니다. 기능 getDBfileXHR에서 함수가 0을 반환하는 경우 함수에 오류가 전달됩니다.

, 약속 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; 
} 

편집 : 내가이 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(); 

    }); 
} 

이 그것을 여러 번 시도해야 할이 작업을 수행하는 깨끗한 방법입니다 (? 회) 다시 시도하는 코드를 제거하면

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 else 절에서 그렇게하고 싶다고 생각합니다. 2. 시도를 반복 할 때'return get '이 아니라'getDBfileXHR (url, serverAttempts);를 반환해야합니다. 그렇지 않으면 후속 요청의 결과를 반환하지 않습니다. – GPicazo

+0

'jsonText = '';'if (jsonText === '') {'의 바로 앞에'jsonText = ''를 넣으려고했기 때문에 약속이 거부되고 오류가 발생하지 않는다고 확신한다. '.resolve()'경우, 코드에서 제거하여 간단하게 만들었습니다. 시도를 반복하는 것에 대해 조언 해 주셔서 감사합니다. 코드 작성 방법을 잘 모르겠습니다. 나는 이것을 지금 고치고있다 : 그래서 나는'getDBfileXHR (url, serverAttempts); 반환한다;'return getDBfileXHR (url, serverAttempts);는 맞습니까? – Louis

답변

0

를 실패 코드가 작동 가능한 것 (못 봤어) -

문제는 귀하의 전화 코드가받는 첫 번째 시도의 유일한 약속입니다. 첫 번째 시도가 실패하면, 그 약속은 해결되지 또는 당신은 getDBfileXHR(url, serverAttempts);에 의해 반환 약속 약속 해결해야

거부 ​​않습니다 - 약속 (1)에 해결되는지 때문에

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

같은 뭔가를 거부 약속 (2), 결과는 (1) 약속의 거절 값을 거부 그 약속 (2)

이 어떻게 기본 약속, 그리고 많은 많은 약속/A + 준수 라이브러리 그래서이 을해야 작동입니다의 경우약속/A + 사양을 따르는 경우

관련 문제