2013-01-18 20 views
17

मैं कोड के इस स्निपेट पाया है कि क्या मैं इसे करना चाहते हैं:jQuery वादे और रीढ़

var promise = this.model.save(); 
$.when(promise).then(function() { 
    console.log(promise.responseText); 
}); 

मैं this.model.save() करने के लिए मेरी रीढ़ कॉल से responseText वापस पाने के लिए चाहते हैं। इस कोड को here दस्तावेज किया गया था। लेकिन यह कुछ भी लॉगिंग नहीं कर रहा है, भले ही मैं console.log() कॉल में कच्ची टेक्स्ट स्ट्रिंग खींचूं।

क्या कोई व्यक्ति आम आदमी के शब्दों में व्याख्या कर सकता है कि एक jQuery वादा क्या है? मैंने उनके बारे में पढ़ा है, लेकिन मुझे नहीं लगता कि मुझे काफी मिला है जो वे थे। इससे मुझे समझने में मदद मिल सकती है कि यह कोड मेरे लिए क्यों काम नहीं कर रहा है। यदि मैं console.log(promise) कोड की पहली और दूसरी पंक्तियों के बीच में हूं, तो मुझे responseText मिलता है। तो $.when या then में कुछ हो रहा है जो इसे गलत होने का कारण बन रहा है।

संपादित करें:

लेख को पढ़ने के बाद, मैं मैं ऐसा कर सकता है की खोज की:

var promise = this.model.save(); 
$.when(promise).then(null, function(obj) { 
    console.log(obj.responseText); 
}); 

लेकिन मुझे समझ नहीं आता क्या null प्रतिनिधित्व करता है। then दो पैरामीटर, एक सफल समारोह और विफलता समारोह लेता प्रतीत होता है। लेकिन सफलता समारोह पहले नहीं होगा? मुझे सर्वर से 200 प्रतिक्रिया मिलती है।

+0

इस http://css.dzone.com/articles/exploring-deferred-and-promise –

+0

यह एक अच्छा लेख की तरह दिखता है पढ़ें। धन्यवाद। – sehummel

+0

नहीं probs :) खुश पढ़ने .. –

उत्तर

26

तो सबसे पहले, मुझे पूरा यकीन है कि आपको when भाग की आवश्यकता नहीं है; jQuery डॉक्स से:

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).

के बाद से वादा पहले से ही एक then विधि है, तो आप सिर्फ कर सकते हैं:

this.model.save().then(null, function(obj) { 
    console.log(obj.responseText); 
}); 

(तथ्य यह है कि इसके बाद के संस्करण कोड लगभग एक अंग्रेजी वाक्य की तरह पढ़ता का एक प्रमुख लाभ यह है कम से कम मेरे लिए, Deferreds का उपयोग करना।)

आपके null तर्क के लिए, दस्तावेज़ फिर से स्पष्ट हैं। वहाँ then के लिए तीन हस्ताक्षर कर रहे हैं (और है कि बस अलग jQuery संस्करणों को कवर करने के है, किसी भी संस्करण कम है):

deferred.then(doneFilter [, failFilter ] [, progressFilter ])

deferred.then(doneCallbacks, failCallbacks)

deferred.then(doneCallbacks, failCallbacks [, progressCallbacks ])

आप देख सकते हैं, सभी तीन पहले ले "किया" समारोह, और विफलता समारोह दूसरा। ऐसा लगता है कि आपको विफलता मिल रही है, जो भ्रमित है। समस्या से बचने का एक तरीका है then का उपयोग न करें। इसके बजाय, निम्न का प्रयास करें:

this.model.save().always(function(obj) { 
    console.log(obj.responseText); 
}); 

इससे आपके कार्य को कोई फर्क नहीं पड़ता कि क्या होता है।हालांकि, आप शायद यह पता लगाने चाहिए क्या हो रहा है, तो आप के बजाय एक सफलता और विफलता कॉलबैक जोड़ने के लिए कुछ डिबगिंग करना चाह सकते हैं:

this.model.save().done(function() { 
    // Success case 
}).fail(function() { 
    // Failure case 
}); 
+0

इस तरह के jQuery के सादे रीढ़ कॉलबैक के बजाय टाल का उपयोग कर के क्या लाभ हैं? 'this.model.save ({सफलता: function() {} , त्रुटि: function() { }});' – Ingro

+2

यह सिर्फ वास्तव में शैली है। आप जटिल कार्य कर रहे होते हैं तो आस्थगित शैली आप ऐसा बहुत सुंदर ढंग से की सुविधा देता है (जैसे दो AJAX कॉल, जहां दूसरी डेटा कि पहले एक से वापस आता है की जरूरत बनाने कहते हैं)। अन्यथा यह वास्तव में सिर्फ एक मामला है कि आप अपना कोड कैसे स्टाइल करना चाहते हैं। और वास्तव में यह एक रीढ़ की हड्डी-विशिष्ट मुद्दा भी नहीं है; ({: हैंडलर सफलता}); 'बनाम,' $ .ajax ({}) किया (हैंडलर) 'से चुनने के लिए सिर्फ सादे पुराने jQuery में आप भी' $ .ajax है।। – machineghost

+0

@ माचिनघोस्ट। आपकी पूरी प्रतिक्रिया के लिए धन्यवाद। यह बहुत समझाता है। – sehummel

7

क्योंकि this.model.save एक वादा देता है, आप कर सकते हैं बजाय निम्नलिखित:

this.model.save() 
    .done(function(response) { 
     console.log("Success!"); 
    }) 
    .fail(function(response) { 
     console.log("Error!"); 
    }); 

(। यही कारण है कि पूरे $.when बिट की तुलना में आसान है)

मेरा अनुमान है कि आप अपनी प्रतिक्रिया एक 200 कोड लौटा रहा है हालांकि , यह अभी भी "असफल" है क्योंकि प्रतिक्रिया डेटा प्रकार आप जो उम्मीद कर रहे हैं उसके साथ मेल नहीं खाता है (dataType में $.ajax कॉल में विशेषता क्या है)।

0

मैं वादा का उपयोग कर के एक बड़े प्रशंसक हूँ, और मुझे लगता है कि वादा साधन विभिन्न पैकेजों में बहुत ही समान चीजें।

अपने प्रश्न का उत्तर देने के लिए, जो पिछले जवाब नहीं थे, "तब" फ़ंक्शन एक वादे का एक कार्य है, "जब" फ़ंक्शन एक असफल-सहेजता है, वस्तु को एक वचन नहीं है, एक " (ओबीजे) "यह सुनिश्चित करेगा कि यह एक वादा है, ताकि आप सुरुचिपूर्ण xxx.then (सफलता() {}, त्रुटि() {}) का उपयोग कर सकें।

बीटीडब्ल्यू, "स्थगित" मशीनघोस्ट ने कहा कि वह पैकेज है जो आपको वादा का उपयोग करने देता है। वादा और इसे कैसे उपयोग करना है, जानने के लिए। इस ट्यूटोरियल को देखें। यह हर चीज को स्पष्ट रूप से समझाता है, यह वह लेख है जिसने मुझे वादे में बनाया है। http://strongloop.com/strongblog/promises-in-node-js-with-q-an-alternative-to-callbacks/

अब, के रूप में machineghost ने कहा, अपना समन्वयन कॉल एक त्रुटि हो रही है, एक बाकी API दस्तावेज़ों के अनुसार लगता है, https://parse.com/docs/rest#, सर्वर होगा प्रतिक्रिया एक JSON (अगर यह रीढ़ के रूप में एक ही है पता नहीं है) इस प्रारूप में एक "बनाने" निवेदन के लिये वस्तु:

{"createdAt": "2011-08-20T02:06:57.931Z","objectId": "Ed1nuqPvcm"} 

मेरा अनुमान है, है शायद अपने सर्वर सही JSON के साथ अनुरोध का जवाब नहीं था, इसलिए बचाने() कार्रवाई विफल रही क्योंकि वहाँ था कोई "createAt लगता है "फ़ील्ड, घटना ने सोचा कि आपके सेवर ने आइटम बनाया है।