2015-05-19 10 views
5

निम्नलिखित कोड रिटर्न:अभी भी वादा क्यों लंबित है?

output.isPending?: true 
output.isRejected?: false 
output.isFulfilled?: false 

क्यों? मैं output.isRejectedtrue होने की उम्मीद कर रहा था।

<html> 

<head> 
    <script src="http://cdnjs.cloudflare.com/ajax/libs/q.js/0.9.7/q.js"></script> 
    <script src="http://jasmine.github.io/2.3/lib/jasmine.js"></script> 
</head> 

<body> 
</body> 
<script> 
var output, bar; 

bar = { 
    doSomethingAsync: function() { 
     var d = Q.defer(); 
     d.resolve('result'); 
     return d.promise; 
    } 
}; 

function Foo(bar) { 
    this._bar = bar; 

    this.go = function() { 
     var deferred = Q.defer(); 
     this._bar.doSomethingAsync() 
      .then(onSuccess.bind(this, deferred)); 

     return deferred.promise; 
    } 
}; 

function onSuccess(deferred, result) { 
    deferred.reject(); 
} 

output = new Foo(bar).go() 
    .finally(function() { 
     console.log('output.isPending?:', output.isPending()); 
     console.log('output.isRejected?:', output.isRejected()); 
     console.log('output.isFulfilled?:', output.isFulfilled()); 
    }); 
</script> 

</html> 

उत्तर

5

क्योंकि outputnew Foo(bar).go() नहीं है। इसे .finally() कॉल का परिणाम सौंपा गया है, और finally कॉलबैक पूरा होने तक हल नहीं किया जाएगा।

यह अपेक्षा के अनुरूप काम करेगा:

var output = new Foo(bar).go(); 
output.finally(function() { 
    console.log('output.isPending?:', output.isPending()); 
    console.log('output.isRejected?:', output.isRejected()); 
    console.log('output.isFulfilled?:', output.isFulfilled()); 
}); 
+0

https://github.com/kriskowal/q से - 'यदि हैंडलर एक वादा करता है, तो आउटपुट समझौता स्थगित हो जाता है ..... ' – Adam

0

मैं सही करता हूं कि एक छोटा विलंब समारोह एपीआई के लिए भी अनावश्यक है जो वादे के लिए अनजान है। मैं सुनिश्चित कर सकता हूं कि resolve या reject हमेशा कॉल किया जाता है, लेकिन वादे के बाद ही देरी के बिना वापस आ जाता है। यहाँ एक उदाहरण है:

var somePromise = function(path) { 
    var deferred = q.defer(); 

    asyncFunction.request(path, function(result) { 
     if (result.error === 0 && result.json !== null) { 
      deferred.resolve(result); 
     } else { 
      deferred.reject(result || {error: -1, message: "bad things happened"}); 
     } 
    }); 

    return deferred.promise; 
}; 

exports.someCall = function(req,res) { 
    somePromise('path') 
     .then(function (result) { 
      ... do action ... 
     }).catch(function (error) { 
      ... handle error ... 
     }); 
}; 
+1

वहाँ 'resolve' की आवश्यकता नहीं है या' एक वादा ही वापस लौटे reject'। सभी कॉलबैक को वैसे भी असीमित रूप से कहा जाता है, भले ही आप अपना वादा कब/कैसे हल करते हैं। इस तरह के स्थगित का उपयोग करना भी [सामान्य एंटीपाटरर्न] (http://stackoverflow.com/q/23803743/1048572) जैसा दिखता है। 'exports.someCall = समारोह (अनुरोध, रेस) { somePromise ('पथ') तो फिर (समारोह (परिणाम) { वापसी somePromise ('नया पथ': – Bergi

+0

इस कोड को अभी भी वादे, श्रृंखलित जैसे होने की अनुमति देता); })। (फ़ंक्शन (परिणाम) { ... कुछ और करें ... ' –

+0

हां यह करता है, लेकिन 'q.delay (1)' अभी भी अनावश्यक है? – Bergi

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