आस्थगित बनाम वादा


83

JQuery के संस्करणों के अलावा डिफर्ड और प्रोमिस के बीच अंतर क्या है?

मुझे अपनी आवश्यकता के लिए क्या उपयोग करना चाहिए? मैं केवल कॉल करना चाहता हूं fooExecute()। मैं केवल जरूरत है fooStart()और fooEnd()उदाहरण के लिए html div स्थिति टॉगल करने के लिए।

//I'm using jQuery v2.0.0
function fooStart() { /* Start Notification */ }
function fooEnd() { /* End Notification */ }
function fooExecute() { /* Execute the scripts */ }

$('#button1').on('click', function() {
    var deferred1 = $.Deferred();
    var promise1 = $.Promise();

    deferred1.???

    promise1.???
});


2
आप वादे की स्थिति को नहीं बदल सकते। इस प्रकार, यह अनुरोध करने वाले तर्क को नियंत्रित किया जाता है (जिसमें शर्तों के तर्क के साथ छेड़छाड़ करने का कोई व्यवसाय नहीं हो सकता है - समाधान करने के लिए या अस्वीकार करने के लिए) - संकल्प की प्रतीक्षा करने के लिए - कारखाने के तर्क से जो वास्तव में उस स्थगित को बनाया गया था। आस्थगित resolveडी या rejectएड अपने राज्य को बदल सकता है , जिसे इसका वादा भी प्रतिबिंबित करेगा। मुझे बताएं कि आप क्लिक के लिए आस्थगित का उपयोग कैसे करना चाहते हैं?
आंद्रेविंस्की

मुझे नहीं लगता कि आपका उदाहरण वादों से लाभान्वित हो सकता है (या मुझे समझ में नहीं आता है)। शायद jQuery deferred का उपयोग कैसे किया जा सकता है पर एक नज़र है?
फेलिक्स क्लिंग

जवाबों:


131

पहला: आप इसका उपयोग नहीं कर सकते $.Promise();क्योंकि यह मौजूद नहीं है।

एक आस्थगित वस्तु एक वस्तु है कि कर सकते हैं बनाने के एक वादा और करने के लिए अपने राज्य को बदलने resolvedया rejected। यदि आप अपना स्वयं का फ़ंक्शन लिखते हैं और कॉलिंग कोड को एक वादा प्रदान करना चाहते हैं, तो डिफ्रेड्स का उपयोग आमतौर पर किया जाता है। आप मूल्य के निर्माता हैं ।

एक वादा है, जैसा कि नाम कहता है, भविष्य के मूल्य के बारे में एक वादा। आप मान प्राप्त करने के लिए उस पर कॉलबैक संलग्न कर सकते हैं। वादा आपको "दिया गया" था और आप भविष्य के मूल्य के रिसीवर हैं ।
आप वादे की स्थिति को संशोधित नहीं कर सकते। केवल कोड है कि बनाया वादा अपने राज्य को बदल सकते हैं।

उदाहरण:

1. ( उत्पादन ) जब आप अपने स्वयं के कार्यों के लिए वादा-समर्थन प्रदान करना चाहते हैं तो आप आस्थगित वस्तुओं का उपयोग करते हैं। आप एक मूल्य की गणना करते हैं और वादा हल होने पर नियंत्रण करना चाहते हैं।

function callMe() {
    var d = new $.Deferred();
    setTimeout(function() {
        d.resolve('some_value_compute_asynchronously');
    }, 1000);
    return d.promise();
}

callMe().done(function(value) {
    alert(value);
});

2. ( आगे ) यदि आप एक फ़ंक्शन कह रहे हैं जो स्वयं एक वादा वापस करता है, तो आपको अपनी स्वयं की आस्थगित वस्तु बनाने की आवश्यकता नहीं है। आप बस वह वादा वापस कर सकते हैं। इस स्थिति में, फ़ंक्शन मान नहीं बनाता है, लेकिन इसके बाद (इसका प्रकार):

function fetchData() {
    // do some configuration here and pass to `$.ajax`
    return $.ajax({...});
}

fetchData().done(function(response) {
    // ...
});

3. ( प्राप्त करें ) कभी-कभी आप वादों / मूल्यों के साथ बनाना या पास नहीं करना चाहते हैं, आप उन्हें सीधे उपयोग करना चाहते हैं, अर्थात आप कुछ के रिसीवर हैं:

$('#my_element').fadeOut().promise().done(function() {
    // called when animation is finished
});

बेशक, इन सभी उपयोग के मामलों को भी मिलाया जा सकता है। आपका कार्य मूल्य का रिसीवर हो सकता है (उदाहरण के लिए अजाक्स कॉल से) और उस पर आधारित एक अलग मूल्य की गणना (उत्पादन) करें।


संबंधित सवाल:


2

एक वादा कुछ ऐसा है जिसे आप आस्थगित ऑब्जेक्ट पर सेट कर सकते हैं जो कि आस्थगित संग्रह पूरा होने पर निष्पादित होता है।

JQuery प्रलेखन से उदाहरण :

<!DOCTYPE html>
<html>
<head>
  <style>
div {
  height: 50px; width: 50px;
  float: left; margin-right: 10px;
  display: none; background-color: #090;
}
</style>
  <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
</head>
<body>

<button>Go</button>
<p>Ready...</p>
<div></div>
<div></div>
<div></div>
<div></div>


<script>
$("button").on( "click", function() {
  $("p").append( "Started...");

  $("div").each(function( i ) {
    $( this ).fadeIn().fadeOut( 1000 * (i+1) );
  });

  $( "div" ).promise().done(function() {
    $( "p" ).append( " Finished! " );
  });
});
</script>

</body>
</html>

यहाँ यह JSFiddle में है

यह प्रत्येक पर एक फ़ंक्शन चलाता है divऔर .promiseसभी .eachनिष्पादन पूर्ण होने पर कोड निष्पादित करता है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.