2012-09-17 21 views
8

मैं कुछ कैसे "q" का उपयोग करने के समझने समस्याओं (https://github.com/kriskowal/q) एक पुस्तकालय जावास्क्रिप्ट के लिए वादा किया:मैं q के साथ कॉलबैक श्रृंखला कैसे करूं?

var delayOne = function() { 
    setTimeout(function() { 
     return 'hi'; 
    }, 100); 
}; 

var delayTwo = function(preValue) { 
    setTimeout(function() { 
     return preValue + ' my name'; 
    }, 200); 
}; 

var delayThree = function(preValue) { 
    setTimeout(function() { 
     return preValue + ' is bodo'; 
    }, 300); 
}; 

var delayFour = function(preValue) { 
    setTimeout(function() { 
     console.log(preValue); 
    }, 400); 

}; 

Q.fcall(delayOne).then(delayTwo).then(delayThree).then(delayFour).end(); 

यह केवल रिटर्न अपरिभाषित ...

उत्तर

9

कारण आप प्राप्त "अनिर्धारित" है, क्योंकि कार्यों आप चेनिंग कर रहे हैं कुछ भी वापस नहीं कर रहे हैं:

var delayOne = function() { 
    setTimeout(function() { 
    return 'hi'; 
    }, 100); 
}; 

delayOne कॉल setTimeout, और कुछ भी नहीं (undefined) देता है।

अपने लक्ष्य को प्राप्त करने के लिए आप का उपयोग करना चाहिए Q.defer:

var delayOne = function() { 
    var d = Q.defer();  
    setTimeout(function() { 
    d.resolve("HELLO"); 
    }, 100); 
    return d.promise; 
}; 

var delayTwo = function(preValue) { 
    setTimeout(function() { 
    alert(preValue); 
    }, 
    400); 
}; 

delayOne().then (delayTwo); 

http://jsfiddle.net/uzJrs/2/

+0

समाधान के लिए धन्यवाद। इसके बावजूद मुझे निर्णय लेना है कि अगर मैं क्यू का उपयोग करता हूं तो मेरी कोड गुणवत्ता में सुधार होगा, दूसरी तरफ यह एक कठिन निर्भरता के परिणामस्वरूप होगा। क्या आपको यह समस्या है तो क्या आपको अनुभव मिला? – bodokaiser

+1

यदि आप कई जंजीर, एसिंक कॉल का उपयोग करते हैं, तो आपको 'पिरामिड ऑफ डूम' से बचने के लिए कुछ लाइब्रेरी की आवश्यकता होगी :)। मैं व्यक्तिगत रूप से asyncjs पसंद करता हूं: https://github.com/caolan/async, और मैंने इसे कुछ मध्यम आकार की परियोजनाओं पर सफलता के साथ उपयोग किया। – wroniasty

12

रूप wroniasty ने कहा, आप उन कार्यों में से प्रत्येक से एक वादा वापस जाने के लिए की जरूरत है, लेकिन आप यह भी सार किसी भी कॉलबैक उन्मुख होना चाहिए एपीआई (जैसे setTimeout) जितना संभव हो सके और एपीआई का उपयोग करें जो बदले में वादे वापस कर देते हैं।

setTimeout के मामले में, क्यू पहले से ही Q.delay(ms) जो एक वादा है कि मिलीसेकेंड की निर्दिष्ट संख्या के बाद सुलझा लिया जाएगा देता है, सही प्रदान करता है setTimeout की जगह के लिए:

var delayOne = function() { 
    return Q.delay(100).then(function() { 
     return 'hi'; 
    }); 
}; 

var delayTwo = function(preValue) { 
    return Q.delay(200).then(function() { 
     return preValue + ' my name'; 
    }); 
}; 

var delayThree = function(preValue) { 
    return Q.delay(300).then(function() { 
     return preValue + ' is bodo'; 
    }); 
}; 

var delayFour = function(preValue) { 
    return Q.delay(400).then(function() { 
     console.log(preValue); 
    }); 
}; 

Q.fcall(delayOne).then(delayTwo).then(delayThree).then(delayFour).done(); 

(ध्यान दें: enddone साथ प्रतिस्थापित किया गया)