2017-11-01 13 views
5

오류 : h1.js:25 Warning: a promise was rejected with a non-error: [object String]약속이 아닌 오류 경고 거부

완전히 확실하지 왜 오류를 이해하는 데 도움이 사랑하고 그 원인을 무엇인지. 아직도 약속과 AJAX를 배우는 것은 매우 감사합니다!

var logisticsModule = (function() { 
    return { 
    initialize: function() { 
     dateTimeFxns.getReservedDates.then(
     // success 
     function(reserved_dates) { 
      console.log("success with value = " + reserved_dates) 
     }, 
     function(error) { 
      console.log("error with value = " + error) 
     } 
    ) 
    } 
    } 
})(); 

var dateTimeFxns = { 
    getReservedDates: new Promise(function(resolve, reject) { 
    $.ajax({ 
     // some url & data 
    }) 
    .done(function(result) { 
     resolve(result) 
    } 
    .fail(function(error) { 
     reject(error) 
    } 
    }) 
} 

$(document).ready(function() { 
    logisticsModule.initialize(); 
}) 

UPDATE 경고 메시지 (I이 쓰기 예를 들어, 나는 또한이 약속은 아약스 객체를 포장하도록 약간 중복 생각하지만, 솔직히 그렇지 않으면 다시 작성하는 방법을 모른다)

.fail(function(jqXHR, textStatus, errorThrown) { 
    reject(new Error(errorThrown)) 
}) 
+0

CONSOLE.LOG (에러)을 수행; 오류가 유형 오류 객체 – linasmnew

+1

이 아님을 말합니다. 문자열을 얻지 만'Error' 객체를 만드는 것이 가장 좋습니다. 그래서 당신의 reject 함수에서'reject (새로운 에러 (에러))'를하십시오. 이는 실제로 오류가 무엇인지에 대한 추가 문제입니다. 장점 : Stack 추적은 'Error' 개체에서 사용할 수 있습니다. –

+0

고마워.하지만 웬일인지 내 문제가 해결되지 않았다. 업데이트를 참조하십시오. – james

답변

2

이 단지 발생 된 오류가 instanceof Error 없다는 것을 의미 : 나는이 .fail으로이 지속되는 경우. 예를 들어, 다음은 오류가 아니지만 던져 버릴 수 있습니다 ... 잘 ... JavaScript에서 무엇이든 던질 수 있습니다.

그러면 멋진 uncaught exception: 42이됩니다.

throw new Error('An actual error'); 

지금 특정 경우에, 당신이 아닌 jQuery를 공급, 첫 번째 인수가 전달하는 오류를 전달해야

Error 사용 실제 오류가 발생합니다. 그것은

.fail(function(jqXHR, textStatus, errorThrown) { 
    reject(new Error(errorThrown)); 
} 
+0

코드를 다음과 같이 만들었습니다.'.fail (function (jqXHR, textStatus, errorThrown) { reject (새 오류 (errorThrown)}))'오류가 계속 발생합니다. 나도 조금 혼란스러워 ... errorThrown 자체가 아약스 자체에서 이미 오류 개체로 나를 위해 포맷해야 안되면? – james

0
... 당신에게 문자열을 제공하므로 오류에 포장

For example, as I write this I also think it's a bit redundant to have a Promise wrapping an ajax object, but honestly I don't know how to re-write it otherwise

당신은 jQuery docs에 명시된 AJAX 객체를 반환하는 함수를 정의 할 수

는 자바 스크립트 약속을 사용하는 개체를 반환 인터페이스.

The jqXHR objects returned by $.ajax() as of jQuery 1.5 implement the Promise interface, giving them all the properties, methods, and behavior of a Promise (see Deferred object for more information).

다음은 이러한 기능을 구현하는 방법에 대한 코드 예제입니다. 예를 들어 데이터에 Random User API을 사용하고 있습니다.

function getRandomUser() { 
 
    return $.ajax({ 
 
    url: 'https://randomuser.me/api/', 
 
    dataType: 'json' 
 
    }) 
 
    .fail(error => console.error(error)); 
 
} 
 

 
// getRandomUser's return value is a Promise like object, which we can chain onto 
 
getRandomUser() 
 
.then(
 
    function(random_user) { 
 
    console.log("success with value = ", random_user) 
 
    }, 
 
    function(error) { 
 
    console.log("error with value = ", error) 
 
    } 
 
);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>