web-dev-qa-db-ja.com

エラー以外の警告でプロミスが拒否されました

エラー: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))
})
8
james

これは、スローされたエラーが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));
}
4
Fenton

たとえば、私がこれを書いているとき、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>
0
Dominic Serrano