2017-11-01 17 views
5

エラー:h1.js:25 Warning: a promise was rejected with a non-error: [object String]約束は非エラー警告で拒否

全くわからない理由、エラーを理解する助けが大好きだし、それを引き起こしているもの。まだ約束とAJAXを学ぶので大いに助けてください! (例えば、私がこれを書いている私も、それは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警告メッセージがこれは単なるスローされたエラーがinstanceof Errorないことを意味し

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

はconsole.log(誤差)を行います。エラーはエラーがタイプのオブジェクトではないことを示していますエラー – linasmnew

+1

文字列を取得しますが、 'Error'オブジェクトを作成することをお勧めします。したがって、あなたのリジェクト関数では 'reject(新しいエラー(エラー))'を行います。これは、実際にエラーが発生している点を除けば、別の問題です。利点:スタックトレースは 'Error'オブジェクトで利用可能です。 –

+0

ありがとうございますが何らかの理由で問題が修正されていません。アップデートをご覧ください – james

答えて

2

:私は.failを持っているときのように持続します。例えば、以下はエラーではありませんが、私はそれを投げることができます。まあ...あなたはJavaScriptで何かを投げることができます。

throw 42; 

これは私に素晴らしいuncaught exception: 42を与えます。

Errorを使用し、実際エラーをスローする:

throw new Error('An actual error'); 

今、あなたの特定のケースでは、あなたはそれが通過する最初の引数ではありませんjQueryの供給、というエラーを渡す必要があります。それはあなたの文字列を与えますので、エラーでラップ...

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

私はこのコードを作成しました: '.fail(function(jqXHR、textStatus、errorThrown){ (new Error(errorThrown)}})'を拒否しました。私も少し混乱しています...もしerrorThrownがajax自体から来たのであれば、それはすでにエラーオブジェクトとしてフォーマットされていませんか? – 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オブジェクトを返す関数を定義することができ、JavaScriptの約束を使用するオブジェクトを返します。インタフェース。

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>

関連する問題