2014-07-17 14 views
20

का उपयोग करके तुरंत एक हल किए गए वादे को वापस करें I जावास्क्रिप्ट (विशेष रूप से AngularJS) में अपने सिर को वादे के आसपास पाने का प्रयास कर रहा हूं।एंगुलरजेएस

मेरे पास एक सेवा में एक फ़ंक्शन है, चलो इसे fooService पर कॉल करें, यह जांचता है कि हमने कुछ डेटा लोड किया है या नहीं। यदि ऐसा किया गया, मैं सिर्फ यह वापस जाने के लिए चाहते हैं, और अगर हम नहीं है, हम डेटा लोड और एक वादा वापस जाने के लिए की जरूरत है:

this.update = function(data_loaded) { 
    if (data_loaded) return; // We've loaded the data, no need to update 

    var promise = Restangular.all('someBase').customGet('foo/bar').then(function(data) { 
     // Do something with the data here 
    } 

    return promise; 
} 

मैं एक समारोह है कि उसके बाद तो जैसे fooService की update फ़ंक्शन को कॉल करने के लिए है :

fooService.update(data_loaded).then(function() { 
    // Do something here when update is finished 
}) 

मेरे यहां मुद्दा यह है कि अगर हम update समारोह में डेटा लोड करने की जरूरत नहीं है, एक वादा वापस नहीं किए गए है, इसलिए .then() मेरे अन्य समारोह में नहीं बुलाया जाता है। दृष्टिकोण यहां क्या होना चाहिए - मूल रूप से मैं update() फ़ंक्शन से तुरंत एक हल किए गए वादे को वापस करना चाहता हूं अगर हमें पुनर्विक्रेता कॉल से डेटा प्राप्त करने की आवश्यकता नहीं है?

उत्तर

26

वर्तमान स्वीकृत जवाब लौटने के बजाय ज्यादा जटिल है, और गाली deferred anti pattern

this.update = function(data_loaded) { 
    if (data_loaded) return $q.when(data); // We've loaded the data, no need to update 

    return Restangular.all('someBase').customGet('foo/bar') 
          .then(function(data) { 
     // Do something with the data here 
    }); 
}; 

या, आगे भी: यहाँ एक सरल तरीका है अपने वादे जावास्क्रिप्ट देशी एक के रूप में एक ही वाक्य विन्यास का उपयोग, आप इस्तेमाल कर सकते हैं और एक पहले से ही हल हो गई जावास्क्रिप्ट वादा लौट

this._updatep = null; 
this.update = function(data_loaded) { // cached 
    this._updatep = this._updatep || Restangular.all('someBase') // process in 
               .customGet('foo/bar'); //.then(.. 
    return this._updatep; 
}; 
+1

एक टिप के लिए धन्यवाद। मैं हमेशा [क्रिस कौवाल के क्यू] (https://github.com/kriskowal/q) के 'क्यू (प्रारंभिक वैल) 'वाक्यविन्यास को याद करता हूं और मुझे' $ q.when (डेटा)' एक ही चाल कर सकते हैं। – runTarm

-1

आप $q.defer() इस तरह इस्तेमाल कर सकते हैं:

this.update = function (data_loaded) { 
    var deferred = $q.defer(); 

    if (data_loaded) { 
     deferred.resolve(null); // put something that your callback will know the data is loaded or just put your loaded data here. 
    } else { 
     Restangular.all('someBase').customGet('foo/bar').then(function(data) { 
      // Do something here when update is finished 
      deferred.resolve(data); 
     } 
    } 

    return deferred.promise; 
}; 

आशा इस मदद करता है।

+0

बिल्कुल जो मैं ढूंढ रहा था - धन्यवाद! :) – samturner

+8

मुझे नहीं पता कि यह दो बार कैसे उभरा है, यह स्थगित विरोधी पैटर्न है और इसे बहुत सरल बनाया जा सकता है। –

+0

यह केवल स्थगित एंटीपाटर नहीं है, यह त्रुटियों को प्रसारित करने में भी विफल रहता है। – Bergi

6

AngularJS की $q सेवा आपको यहां सहायता करेगी। यह Kris Kowal's Q वादा पुस्तकालय की तरह है।

जब आपके पास एसिंक विधि है जो एक वादा या मूल्य वापस कर सकता है $q.when विधि का उपयोग करें। यह कभी भी पारित किया जाएगा, चाहे वह एक वादा या मूल्य हो और एक वादा तैयार किया जाए जिसे पारित किए गए वादे के आधार पर हल/अस्वीकार कर दिया जाएगा, या यदि मूल्य पारित किया जाता है तो हल किया जाएगा।

$q.when(fooService.update(data_loaded)).then(function(data){ 
    //data will either be the data returned or the data 
    //passed through from the promise 
}) 

और फिर अपने अद्यतन समारोह में डेटा वापस बस

if (data_loaded) return data_loaded; 
31

के रूप में: Promise.resolve()

return(Promise.resolve("MyReturnValue")); 
+0

यह वह जवाब है जो मैं चाहता था; मेरे पास एक मूल्य है; यह तैयार है, मैं इसे एपीआई को संतुष्ट करने के लिए एक वादे में लपेटना चाहता हूं जो वादे की उम्मीद करता है ... इसलिए ओपी ने पूछा, "तत्काल एक हल किए गए वादे को वापस कर दें", जो ** ** चाहता था वह "वादा वापस कर देना था, मैंने तुरंत हल किया (एक शाब्दिक के साथ) " –

+0

यही वही था जो मैं चाहता था। मेरे पास एक ऑब्जेक्ट है और केवल एक वादा वापस करने की आवश्यकता है क्योंकि एपीआई की अपेक्षा है। – richard

+0

इस उत्तर पर आईई समर्थन के लिए सावधान। $ q क्रॉस ब्राउज़र समर्थन प्रदान करता है –