2017-11-01 51 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(); 
}) 

अद्यतन चेतावनी संदेश

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

console.log (त्रुटि) करते हैं, त्रुटि यह कह रही है कि त्रुटि प्रकार की वस्तु नहीं है त्रुटि – linasmnew

+1

आपको एक स्ट्रिंग मिलती है, लेकिन 'त्रुटि' ऑब्जेक्ट बनाना सर्वोत्तम होता है। तो आपके अस्वीकार समारोह में 'अस्वीकार करें (नई त्रुटि (त्रुटि)) '। वास्तव में त्रुटि क्या है इसके अलावा यह एक अतिरिक्त मुद्दा है। लाभ: स्टैक ट्रेस 'त्रुटि' ऑब्जेक्ट पर उपलब्ध होगा। –

+0

धन्यवाद लेकिन किसी कारण से उसने मेरी समस्या को ठीक नहीं किया है, अपडेट करें – james

उत्तर

2

यह सिर्फ मतलब है कि त्रुटि है कि फेंक दिया गया था एक instanceof Error नहीं है: बनी रहती है जब मैं .fail के रूप में की है। उदाहरण के लिए, निम्नलिखित कोई त्रुटि नहीं है, लेकिन मैं इसे फेंक सकता हूं क्योंकि ... अच्छी तरह से ... आप जावास्क्रिप्ट में कुछ भी फेंक सकते हैं।

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) { अस्वीकार करें (नई त्रुटि (त्रुटि ट्राउन))} 'और अभी भी त्रुटि हो रही है। मैं थोड़ा उलझन में हूं ... अगर त्रुटि ट्राउन अजाक्स से है तो क्या इसे पहले से ही मेरे लिए त्रुटि ऑब्जेक्ट के रूप में स्वरूपित नहीं किया जाना चाहिए? – 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

आप एक समारोह कि AJAX वस्तु है, जो jQuery docs में कहा गया है देता है निर्धारित कर सकते हैं, एक वस्तु जावास्क्रिप्ट वादा का उपयोग करता है देता है इंटरफेस।

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>

संबंधित मुद्दे