2013-08-22 7 views
8

मुझे अनुक्रमिक रूप से वादे चलाने में कठिनाई हो रही है।क्रमशः जावास्क्रिप्ट में क्यू के साथ वादे कैसे चलाएं?

var getDelayedString = function(string) { 
    var deferred = Q.defer(); 

    setTimeout(function() { 
     document.write(string+" "); 
     deferred.resolve(); 
    }, 500); 

    return deferred.promise; 
}; 

var onceUponATime = function() { 
    var strings = ["Once", "upon", "a", "time"]; 

    var promiseFuncs = []; 

    strings.forEach(function(str) { 
     promiseFuncs.push(getDelayedString(str)); 
    }); 

    //return promiseFuncs.reduce(Q.when, Q()); 
    return promiseFuncs.reduce(function (soFar, f) { 
     return soFar.then(f); 
    }, Q());  
}; 

getDelayedString("Hello") 
.then(function() { 
    return getDelayedString("world!") 
}) 
.then(function() { 
    return onceUponATime(); 
}) 
.then(function() { 
    return getDelayedString("there was a guy and then he fell.") 
}) 
.then(function() { 
    return getDelayedString("The End!") 
}) 

onceUponATime() [ "पर", "एक", "समय" "एक बार",] उत्पादन क्रमानुसार चाहिए लेकिन इसके बावजूद वे किसी कारण से तुरंत उत्पादन किया जा रहा है। यहाँ

jsFiddle: http://jsfiddle.net/6Du42/2/

किसी भी विचार मैं गलत क्या कर रहा हूँ?

उत्तर

15

लेकिन इसके बजाय वे किसी कारण से तुरंत आउटपुट कर रहे हैं।

आप उन्हें पहले से ही यहाँ बुला रहे हैं:

promiseFuncs.push(getDelayedString(str)); 
//        ^^^^^ 

आप पुश करने के लिए function(){ return getDelayedString(str); } की आवश्यकता होगी। बीटीडब्ल्यू, each लूप में किसी सरणी को धक्का देने के बजाय आपको map का उपयोग करना चाहिए। और वास्तव में क्या तुम सच में लगता है कि वैसे भी जरूरत नहीं है, लेकिन सीधे सरणी कर सकते हैं reducestrings से अधिक:

function onceUponATime() { 
    var strings = ["Once", "upon", "a", "time"]; 

    return strings.reduce(function (soFar, s) { 
     return soFar.then(function() { 
      return getDelayedString(s); 
     }); 
    }, Q());  
} 

ओह, और don't use document.write

+0

उत्तर और अतिरिक्त संकेतों के लिए धन्यवाद! – Nick

+1

हाँ, यह काम करने के लिए एक समारोह * कारखाना * होना चाहिए, अन्यथा यह तुरंत निष्पादित करता है। – FlavorScape

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