2013-07-07 10 views
25

क्या कॉफ़ीस्क्रिप्ट में Promises चेन करने का कोई तरीका है। उदाहरण के लिए, निम्नलिखित जावास्क्रिप्ट कोड पर विचारकॉफ़ीस्क्रिप्ट में चेनिंग वादे

return $.getJSON('/api/post.json') 
    .then(function(response) { 
    // do something 
    }) 
    .then(function(response) { 
    // do something 
    }) 
    .then(null, function(err) { 
    // do something 
    }); 

then's से प्रत्येक वैकल्पिक है, और अंतिम then समारोह से वापस आ जाना चाहिए। वर्तमान में मैं, के रूप में coffeescript में यह लिख रहा हूँ

promise = $.getJSON('/api/post.json') 
promise = promise.then (response) -> 
    // do something 

promise = promise.then (response) -> 
    // do something 

promise = promise.then null, (err) -> 
    // do something 

return promise 

वहाँ यह करने के लिए एक बेहतर तरीका है? धन्यवाद।

$.getJSON('/api/post.json') 
    .then((response) -> 
     # do something 
    ).then((response) -> 
     # do something 
    ).then null, (err) -> 
     # do something 

नोट then() तर्क आसपास कोष्ठक:

+0

आप IcedCoffeeScript पर भी एक नज़र डाल सकते हैं। यह थोड़ा अलग काम करता है, लेकिन यह काफी अच्छी तरह से काम करता है। –

उत्तर

40

यहेज्केल सही तरीके से दिखाता है, लेकिन इसे कार्यों के चारों ओर कोष्ठक की आवश्यकता नहीं है। बस करें:

$.getJSON '/api/post.json' # As of CoffeeScript 1.7, you don't need the parentheses here either. 
.then (response) -> 
    # do something 
    response # if you would not return anything, promise would be fulfilled with undefined 
.then (response) -> 
    # do something 
    undefined # necessary to prevent empty function body 
.then null, (err) -> 
    # handle error 

मुझे लगता है कि यह आश्चर्यजनक रूप से साफ है। एक चीज जो अपेक्षाकृत गन्दा है, जब आपको एक ही समय में अस्वीकृत और पूर्ण हैंडलर जोड़ने की आवश्यकता होती है।

नोट: पिछली बार मैंने चेक किया, यह कॉफीस्क्रिप्ट रेडक्स में काम नहीं करता था, लेकिन यह कुछ महीने पहले था।

नोट 2: आपको कार्य करने के लिए प्रत्येक फ़ंक्शन बॉडी में वास्तविक कोड की कम से कम एक पंक्ति (यानी केवल एक टिप्पणी नहीं) की आवश्यकता है। आमतौर पर, आप करेंगे, इसलिए यह एक बड़ा मुद्दा नहीं है।

+0

धन्यवाद। यह कॉफ़ीस्क्रिप्ट संकलक में काम करता है। –

+0

डाउनवॉटेड क्योंकि यह कॉफीस्क्रिप्ट 1.4.0 या 1.6.3 (नवीनतम) में संकलित नहीं है। मेरे उत्तर में दिखाए गए कोष्ठक आवश्यक हैं। –

+4

@EzekielVictor: जागरूक होने के लिए धन्यवाद। मैंने बस इसमें देखा, और समस्या यह प्रतीत होती है कि श्रृंखला के दूसरे हिस्से में एक फंक्शन बॉडी की कमी थी। इंडेंट टिप्पणी काफी प्रतीत नहीं हुई थी। मैंने अंत में एक स्पष्ट "अपरिभाषित" जोड़ा ताकि यह संकलित हो। मैंने कभी इस मुद्दे में भाग नहीं लिया है क्योंकि मेरे पास इन स्थानों में कभी खाली कार्य निकायों नहीं थे। –

4

यह शायद सबसे अच्छा तुम कर दूँगा है। कुछ भी पृथ्वी टूटने की उम्मीद नहीं है लेकिन उम्मीद है कि यह मदद करता है।

+0

धन्यवाद। ब्रांड्स को खोना, जैसा कि @ मेरिन स्टॉल सुझाव देता है कि यह बेहतर हो जाता है। –

+3

कोष्ठक खोना? मुझे लगता है कि आप उन्हें खोने का मतलब है। दुनिया पर कोष्ठक खोने का विचार वास्तव में डरावना है। –

12

यह, वादे लिखने के लिए एक छोटा सा अतिरिक्त खरोज

doSomething =() -> new RSVP.Promise (resolve, reject) -> 
    if 1 is 1 
    resolve 'Success' 
    else 
    reject 'Error' 

doSomething() 
.then (res) -> 
     console.log 'Step 1 Success Handler' 

    , (err) -> 
     console.log 'Step 1 Error Handler' 

.then (res) -> 
     console.log 'Step 2 Success Handler' 

.then (res) -> 
     console.log 'Step 3 Success Handler' 

    , (err) -> 
     console.log 'Step 3 Error Handler' 

कौन सा करने के लिए संकलित साथ मेरे निजी पसंदीदा तरीका है:

var doSomething; 

doSomething = function() { 
    return new RSVP.Promise(function(resolve, reject) { 
    if (1 === 1) { 
     return resolve('Success'); 
    } else { 
     return reject('Error'); 
    } 
    }); 
}; 

doSomething().then(function(res) { 
    return console.log('Step 1 Success Handler'); 
}, function(err) { 
    return console.log('Step 1 Error Handler'); 
}).then(function(res) { 
    return console.log('Step 2 Success Handler'); 
}).then(function(res) { 
    return console.log('Step 3 Success Handler'); 
}, function(err) { 
    return console.log('Step 3 Error Handler'); 
}); 

कुछ उदाहरणों जहां यह वास्तव में अच्छी तरह से भी काम करता है के होते हैं:

step1Success = (res) -> console.log 'Step 1 Success Handler' 
step1Error = (err) -> console.log 'Step 1 Error Handler' 

step2Success = (res) -> console.log 'Step 2 Success Handler' 

step3Success = (res) -> console.log 'Step 3 Success Handler' 
step3Error = (err) -> console.log 'Step 3 Error Handler' 

doSomething() 
    .then(step1Success, step1Error) 
    .then(step2Success) 
    .then(step3Success, step3Error) 

कॉफी-स्क्रिप्ट v1.6.3

पर परीक्षण किया गया
+0

यह अच्छी तरह से काम करता है, और केवल एक चीज जिसने मुझे थोड़ा सा लटका दिया है यह सुनिश्चित करना है कि आपके पास कोड में कोई रिक्त स्थान न हो। यह उन नए लोगों के लिए आम तौर पर आम है, लेकिन मुझे उपरोक्त कोड को संकलित करने के लिए कोड नहीं मिला जब तक मुझे एहसास हुआ कि मेरे पास टैब के सेट में एक ही स्थान था। –

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