2015-05-02 7 views
19

मेरे पास एक ऐसा फ़ंक्शन है जो एक jQuery वादा देता है। यह इस तरह दिखता है:एक खाली वादा वापस करें

addBooks(books: Array<Books>) { 
    return $.ajax({ 
     url: '/Books/AddBooks/', 
     type: 'POST', 
     data: ko.toJSON(books), 
     contentType: 'application/json' 
    }); 
} 

मैं इस तो मैं इस समारोह और श्रृंखला की तरह वादा कॉलबैक का पुन: उपयोग कर सकते हैं:

addBooks.done(() => { alert("Books added!"); }) 

मेरा प्रश्न है, क्या मैं जल्दी addBooks को तोड़ने और को रोकने के लिए चाहते हैं, तो सर्वर के लिए एक यात्रा। उदाहरण के लिए:

addBooks(books: Array<Books>) { 

    // An empty array was passed in for some reason. 
    // Theres nothing to add so dont try to POST 
    if (books <= 0) return null; 

    return $.ajax({ 
     url: '/Books/AddBooks/', 
     type: 'POST', 
     data: ko.toJSON(books), 
     contentType: 'application/json' 
    }); 
} 

मेरे उदाहरण संकलन नहीं होगा क्योंकि मेरे श्रृंखलित किया कॉलबैक उदाहरण एक वादा वस्तु रिक्त नहीं लौटने के लिए, addBooks उम्मीद कर रही है। मैं एक खाली वादा कैसे वापस कर सकता हूं (या जो भी सही वस्तु मुझे स्थिति में वापस करनी चाहिए)?

उत्तर

20

मैं एक खाली वादा कैसे वापस कर सकता हूं (या जो भी सही वस्तु मुझे स्थिति में वापस करनी चाहिए)?

हाँ, एक "खाली वादा" यदि आप एक वादा है कि पहले से ही कुछ भी नहीं (undefined, null) के साथ पूरी हो जाती है मतलब उचित यहाँ, है।

इस तरह के एक एकल (या कोई) तर्क के साथ $.when उपयोग कर रहा है बनाने के लिए jQuery वाक्य रचना:

if (books <= 0) return $.when(null); 
+1

मुझे '$ .when' के इस उपयोग के बारे में पता नहीं था, लेकिन यह दस्तावेज़ों में ठीक है! –

6

आप एक संकल्प लिया वादा लौट सकते हैं: इसके बजाय

if (books <= 0) return null; 

उपयोग

if (books <= 0) return $.Deferred().resolve(); 

खबरदार, हालांकि, कि jQuery के Promise एपीआई कुछ आश्चर्य की बात करता है: कभी कभी यह कहता है आपके done/then/आदि। done/then/आदि के साथ समकालिक रूप से कॉलबैक। कॉल, कभी-कभी यह नहीं करता है। अधिकांश वादे पुस्तकालय सुनिश्चित करते हैं कि कॉल हमेशा असीमित है, भले ही आप done/then/आदि पर कॉल कर रहे हों। एक हल किए गए वादे पर। jQuery नहीं करता है, तो आप सूक्ष्म अंतर मिलता है।

उदाहरण के लिए

, इस कोड:

addBooks(() => console.log(1)); 
console.log(2); 

... प्रवेश करेंगे

 
2 
1 

... यदि आप ajax कॉल किया था, लेकिन

 
1 
2 

... अगर आप एक हल किए गए वादे को वापस कर देते हैं।

+0

यह संकलित करता है लेकिन मुझे अतिरिक्त कोड जोड़ना पड़ा क्योंकि '$। से भिन्न 'वापसी प्रकार' $ .ajax' के रिटर्न प्रकार से अलग है। मुझे @ बर्गि ने जवाब दिया क्योंकि यह थोड़ा कम कोड है। –

3

https://api.jquery.com/jquery.when/

से आप सभी को इसे पारित नहीं है, तो किसी भी तर्क, jQuery.when() एक हल किए गए वादे को वापस कर देगा।

उदा।

if (books <= 0) return $.when(); 

और, आप एक मूल्य है कि पारित कर दिया अनिर्धारित नहीं की जरूरत है:

एक एकल तर्क) jQuery.when (करने के लिए पारित कर दिया है और यह है एक स्थगित या नहीं वादा, इसे एक हल किए गए डिफर्ड के रूप में माना जाएगा और किसी भी किए गए कॉलबैक तुरंत निष्पादित किए जाएंगे। किया गया कॉलबैक मूल तर्क पारित कर दिया जाता है।

उदा। एक खाली सरणी पारित की जाती है:

if (books <= 0) return $.when([]); 

उदा। एक खाली वस्तु पारित की जाती है:

if (books <= 0) return $.when({}); 
संबंधित मुद्दे