エラー:h1.js:25 Warning: a promise was rejected with a non-error: [object String]
理由は完全にはわかりませんが、エラーとその原因を理解するのに役立ちます。それでもPromiseとAJAX=を学習しているので、非常に感謝します!(たとえば、これを書いているときに、Promiseが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();
})
.fail
as:
.fail(function(jqXHR, textStatus, errorThrown) {
reject(new Error(errorThrown))
})
これは、スローされたエラーがinstanceof Error
ではないことを意味します。たとえば、次はエラーではありませんが、JavaScriptで何でもスローできるので、私はそれをスローできます。
throw 42;
すばらしいuncaught exception: 42
を提供してくれます。
actualエラーをスローするには、Error
を使用します。
throw new Error('An actual error');
ここで、特定のケースでは、jQueryが提供するエラーを渡す必要があります。これは、渡される最初の引数ではありません。それはあなたに文字列を与えるので、エラーに包みます...
.fail(function(jqXHR, textStatus, errorThrown ) {
reject(new Error(errorThrown));
}
たとえば、私がこれを書いているとき、ajaxオブジェクトをラップするPromiseを使用することは少し冗長だと思いますが、正直に言えば、それを別の方法で書き直す方法がわかりません
jQuery docs に記述されているAJAXオブジェクトを返す関数を定義して、JavaScript Promiseインターフェイスを使用するオブジェクトを返すことができます。
JQuery 1.5の時点で$ .ajax()によって返されるjqXHRオブジェクトはPromiseインターフェースを実装し、Promiseのすべてのプロパティ、メソッド、および動作を提供します(詳細については、遅延オブジェクトを参照してください)。
このような関数を実装する方法のコード例を次に示します。 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>