के एक शुद्ध जावास्क्रिप्ट उदाहरण के लिए वादा उदाहरण तुलना करते हैं:
// First we need a convenience function for W3C's fiddly XMLHttpRequest.
// It works a little differently from the promise framework. Instead of
// returning a promise to which we can attach a handler later with .then(),
// the function accepts the handler function as an argument named 'callback'.
function requestSomeDataAndCall(url, callback) {
var req = new XMLHttpRequest();
req.onreadystatechange = resHandler;
req.open("GET", url, false);
req.send();
function resHandler() {
if (this.readyState==4 && this.status==200) {
callback(this);
} else {
// todo: Handle error.
}
}
}
requestSomeDataAndCall("http://example.com/foo", function(res){
setTimeout(function(){
var data = JSON.parse(res.responseText);
setTimeout(function(){
var price = data.price;
setTimeout(function(){
print("The price is "+price);
},10);
},10);
},10);
});
के रूप में नॉर्बर्ट हार्टल ने कहा, JSON.parse() ब्राउज़र बड़ी स्ट्रिंग्स के लिए रखती हूँ। तो मैंने अपने निष्पादन में देरी (10 मिलीसेकंड के विराम के बाद) में सेटटाइमआउट() का उपयोग किया। यह क्रिस कौवाल के समाधान का एक उदाहरण है। यह वर्तमान जावास्क्रिप्ट थ्रेड को पूरा करने की अनुमति देता है, ब्राउज़र को डीओएम परिवर्तन प्रस्तुत करने के लिए मुक्त करता है और कॉलबैक चलाने से पहले उपयोगकर्ता के लिए पृष्ठ स्क्रॉल करता है।
मुझे उम्मीद है कि आमज वादा ढांचा सेटटाइमआउट जैसे कुछ भी उपयोग करता है, अन्यथा लेख के उदाहरण में बाद के वादे वास्तव में डर के रूप में सिंक्रनाइज़ रूप से चलेंगे।
ऊपर मेरा विकल्प बहुत बदसूरत दिखता है, बाद की प्रक्रियाओं के साथ आगे इंडेंटेशन की आवश्यकता होती है। मैं, कोड का पुनर्गठन ताकि हम सभी एक स्तर में हमारी प्रक्रिया श्रृंखला प्रदान कर सकते हैं:
function makeResolver(chain) {
function climbChain(input) {
var fn = chain.shift(); // This particular implementation
setTimeout(function(){ // alters the chain array.
var output = fn(input);
if (chain.length>0) {
climbChain(output);
}
},10);
}
return climbChain;
}
var processChain = [
function(response){
return JSON.parse(response.body);
},
function(data){
return data.price; // get the price
},
function(price){
print("The price is " + price);
}
];
var climber = makeResolver(promiseChain);
requestSomeDataAndCall("http://example.com/foo", climber);
मैं जावास्क्रिप्ट में कॉलबैक की है कि पारंपरिक आगे गुजर प्रदर्शित करने के लिए उम्मीद कर रही थी वादे करने के लिए काफी बराबर है। हालांकि, मूल उदाहरण में कोड की नीरसता के संदर्भ में, मैंने दो प्रयासों के बाद दिखाया है कि वादे एक बहुत ही सुरुचिपूर्ण समाधान हैं!
आप सही हैं, सिंक्रोनस ऑपरेशंस के लिए वादे का उपयोग करने में कोई बात नहीं है। तो परिणाम बराबर होना चाहिए। लेकिन फिर यह एक उदाहरण है और वादे के उपयोग के लिए दिखाता है। आपके उदाहरण के बाद चल रहे कोड के लिए वास्तव में एक अंतर है। यदि आपको उदाहरण के बाद कुछ चलाने की आवश्यकता है, तो आप इसे कर सकते हैं (वादा दृष्टिकोण का उपयोग करके) उदाहरण कोड क्या कर रहा है इसके बारे में कुछ भी जानने के बिना –