javascript AngularJS का उपयोग करते हुए तुरंत एक निश्चित वादा वापस करें




promise restangular (4)

वर्तमान स्वीकृत उत्तर अत्यधिक जटिल है, और स्थगित विरोधी पैटर्न का दुरुपयोग करता है। यहां एक सरल दृष्टिकोण है:

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;
};

मैं जावास्क्रिप्ट में वादे के आसपास मेरे सिर को पाने की कोशिश कर रहा हूं (विशेष रूप से कांगरीजेएस)।

मेरे पास एक सेवा में एक फ़ंक्शन है, चलो इसे 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 कॉल करता है:

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

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


AngularJS की $ 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;

आप इस तरह $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;
};

उम्मीद है की यह मदद करेगा।


जैसा आपके वादे जावास्क्रिप्ट मूल एक के रूप में एक ही वाक्यविन्यास का उपयोग करते हैं, आप उपयोग कर सकते हैं और पहले से ही हल किए गए जावास्क्रिप्ट वचन को वापस कर सकते हैं: Promise.resolve ()

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






angular-promise