2012-04-02 14 views
7

में AJAX के साथ जावास्क्रिप्ट चर अद्यतन करें मेरे पास एक जावास्क्रिप्ट फ़ंक्शन है जिसे संख्यात्मक गणना करने की आवश्यकता है। इस गणना में उपयोग की जाने वाली कुछ संख्याओं को डेटाबेस में संग्रहीत किया जाता है, और वे इस बात पर निर्भर होंगे कि कोई उपयोगकर्ता ऑनलाइन फॉर्म कैसे भरता है। एक बार जब उपयोगकर्ता फॉर्म भर जाता है, तो वे कैलकुलेट बटन पर क्लिक करेंगे। इस समय, जेएस फ़ंक्शन में, मैं डेटाबेस से मूल्य प्राप्त करने के लिए AJAX का उपयोग करना चाहता हूं जो उपयोगकर्ता द्वारा चुने गए किसी अन्य मूल्य से मेल खाता है।रीयल-टाइम

एक साधारण उदाहरण के लिए: 3 आकार के टी-शर्ट हैं, प्रत्येक आकार (डेटाबेस में संग्रहीत) के आधार पर अलग-अलग कीमतों के साथ। उपयोगकर्ता आकार चुनता है, और जब वे कैलकुलेट पर क्लिक करते हैं, तो मैं उनके द्वारा चुने गए आकार से जुड़े मूल्य प्राप्त करने के लिए AJAX का उपयोग करता हूं।

सवाल यह है कि, मैं कुछ चरों को अद्यतन करने के लिए AJAX का उपयोग करना चाहता हूं जिसे मैं बाद में स्क्रिप्ट में उपयोग करूंगा। जिस तरह से मैं इसे करने की कोशिश कर रहा हूं अब काम नहीं करता है, स्क्रिप्ट में परिवर्तनीय AJAX से अद्यतन नहीं होता है, मैं केवल AJAX कॉल के success फ़ंक्शन के अंदर डेटाबेस से मूल्य तक पहुंच सकता हूं। मैं समझता हूं कि ऐसा इसलिए है क्योंकि प्रकृति द्वारा एसिंक्रोनस में AJAX, और कुछ समय लगता है, सर्वर से डेटा वापस करने की प्रतीक्षा कर रहा है, जबकि फ़ंक्शन अभी भी

निम्न उदाहरण में, AJAX कॉल JSON डेटा देता है , और मेरे पास isjson() नामक फ़ंक्शन है जो परीक्षण करता है कि लौटाई गई स्ट्रिंग वास्तव में JSON डेटा है।

उदाहरण कोड:

function calculate_cost(){ 

    var price = 0; 
    var size = $('form#tshirt_form [name="size"] option:selected').val(); 
    $.ajax({ 
     url:'my_script.php', 
     type:'post', 
     data:'select=price&table=tshirts.prices&where=size = "' + size + '"', 
     success:function(data){ 
      if(isjson(data)){ 
       data = $.parseJSON(data); 
       data = data[0]; 
       price = data['price']; 
      }else{ 
       //display error getting data 
      } 
     } 
    }); 
    // continue code for calculation 
    // this alert will display "0", but I want the price from the database in there 
    alert(price); 
    //perhaps do other ajax calls for other bits of data 
    //... 
    return final_price; 
} 

क्या किसी को पता है कि मैं यह कैसे पूरा कर सकते हैं, वास्तविक समय में ajax के साथ चर को अद्यतन करने के ??

बहुत बहुत धन्यवाद!

** संपादित करें **

मदद के लिए

सभी को धन्यवाद, मैं ajax जा रहा है अतुल्यकालिक के बारे में समझते हैं। मुझे वास्तव में एक उत्तर पसंद आएगा जहां मुझे success फ़ंक्शन के अंदर गणना जारी रखने की आवश्यकता नहीं है, क्योंकि मेरी वास्तविक समस्या में कुछ अलग-अलग तालिकाओं से कई मान शामिल हैं। मैं भी भविष्य में गणना पर विस्तार करने में सक्षम होना चाहूंगा बिना इसे गड़बड़ कर। यदि यह संभव नहीं है, तो, मुझे इसके साथ रहना होगा। ;-)

** संपादित 2 **

ठीक है, हम इस सवाल का जवाब मिल गया है: जाहिर है यह, सही डॉक्स पृष्ठ पर शीर्ष के पास है: -/अत: क्षमा करें। JQuery AJAX कॉल में async संपत्ति। http://api.jquery.com/jQuery.ajax/

+5

'डेटा: 'क्वेरी = tshirts.prices से मूल्य का चयन करें जहां आकार ="' + आकार + '' ',' कृपया ऐसा न करें। क्या होगा यदि डेटा: 'क्वेरी = ड्रॉप टेबल उपयोगकर्ता' – karim79

+2

मुझे आशा है कि आप 'डेटा: क्वेरी =' भाग – bububaba

+0

वाह से कुछ मेगा-चालाक इनपुट स्वच्छता करें, धन्यवाद, हाँ मैं यह विनाशकारी हो सकता है –

उत्तर

11

है ऐसा इसलिए है क्योंकि ajax डिफ़ॉल्ट रूप से और इससे पहले कि नियंत्रण पहुँच alert(price); अनुरोध अभी तक क्रियान्वित नहीं किया है और अभी भी पुराने price मूल्य रखती है एसिंक्रोनस रूप से अनुरोध कार्यान्वित अंदर गणना करनी है।

यदि आप इसे समकालिक रूप से निष्पादित करना चाहते हैं तो आप async को गलत पर सेट कर सकते हैं।

$.ajax({ 
    async: false, 
    ..... 
    ..... 
}); 
+0

यह है !!! बेशक डॉक्स में सबसे अधिक संभावना: -/ –

2

आप सफलता समारोह

function calculate_cost(){ 

var price = 0; 
var size = $('form#tshirt_form [name="size"] option:selected').val(); 
$.ajax({ 
    url:'my_script.php', 
    type:'post', 
    data:'query=select price from tshirts.prices where size = "' + size + '"', 
    success:function(data){ 
     if(isjson(data)){ 
      data = $.parseJSON(data); 
      data = data[0]; 
      price = data['price']; 
      // continue code for calculation 
      // this alert will display "0", but I want the price from the database in there 
      alert(price); 
      //perhaps do other ajax calls for other bits of data 
      //... 
     }else{ 
      //display error getting data 
     } 
    } 
}); 

// return final_price; this function wont be able to return a value 
} 
1

ajax अतुल्यकालिक है और इसलिए है कि आप

$.ajax({ 
    url:'my_script.php', 
    type:'post', 
    data:'query=select price from tshirts.prices where size = "' + size + '"', 
    success:function(data){ 
     if(isjson(data)){ 
      data = $.parseJSON(data); 
      data = data[0]; 
      price = data['price']; 
      //call another function (maybe make another ajax call) from here 
      dosomethingwithprice(price); 
     }else{ 
      //display error getting data 
     } 
    } 
}); 
1

आपका ajax कोड (यद्यपि बहुत ज्यादा नहीं) निष्पादित करने के लिए समय लगता है आप कॉलबैक में क्या करने की जरूरत करना इस कारण के लिए आप अपने कोड refactor चाहिए ; हालांकि AJAX कॉल के बाद कोड को अतुल्यकालिक रूप से निष्पादित किया जाता है, और अजाक्स कॉल के परिणामों से पहले सबसे अधिक संभावना होती है।

इसके बजाय, आप if(isjson(data)) क्षेत्र के शरीर में चेतावनी (मूल्य) को स्थानांतरित करने का प्रयास क्यों नहीं करते हैं, और फिर एक कॉलबैक फ़ंक्शन निष्पादित करें जो उस मूल्य को वापस लौटाता है जिस पर आपको उपयोग की जाने वाली अन्य उपयोगिता की आवश्यकता होती है?

1

आपको कॉलबैक स्टैक के अंदर अपनी गणना करना है। अजाक्स एसिंक काम करते हैं, इसका मतलब है कि, कॉलबैक फ़ंक्शन शुरू होने से पहले कोड कॉलबैक फ़ंक्शन चलाता है। तो आपको कॉलबैक में अपनी गणना करनी चाहिए।

function calculate_cost(){ 

    var price = 0; 
    var size = $('form#tshirt_form [name="size"] option:selected').val(); 
    $.ajax({ 
     url:'my_script.php', 
     type:'post', 
     data:'query=select price from tshirts.prices where size = "' + size + '"', 
     success:function(data){ 
      if(isjson(data)){ 
       data = $.parseJSON(data); 
       data = data[0]; 
       price = data['price']; 
      }else{ 
       //display error getting data 
      } 

    // continue code for calculation 
    // this alert will display "0", but I want the price from the database in there 
    alert(price); 
    //perhaps do other ajax calls for other bits of data 
    //... 
     return final_price; 
     } 
    }); 

} 
+0

हां, मुझे पता है कि अजाक्स असीमित रूप से काम करता है, इसलिए मैंने अपने प्रश्न में यह जोड़ा। मैं ऐसा करने का एक तरीका चाहता था जहां मुझे अपना दूसरा कोड 'सफलता' समारोह में रखना न पड़े। –

+0

'वापसी अंतिम_प्रकाश; 'वास्तव में मूल कार्य से मूल्य वापस नहीं करेगा, जो केवल AJAX कॉलबैक से बाहर निकलता है। @jeffery_the_wind - इस विधि की संरचना को बदलने की जरूरत है ताकि countate_cost() किसी मान के बजाय एक स्थगित ऑब्जेक्ट देता है। –

0

मेरा सुझाव है कि AJAX कॉल एक स्थगित ऑब्जेक्ट लौटाए। फिर, जब अंतिम मूल्य पूरी तरह से गणना की जाती है, तो उस मान के साथ स्थगित वस्तु को हल करें।

function calculate_cost() { 
    var price = 0, 
     size = $('#tshirt_form [name="size"] option:selected').val(), 
     def = $.Deferred(); 

    $.ajax({ 
     data: {size:size}, 
     url: 'my_script.php', 
     type: 'post', 
     dataType: 'json', 
    }).done(function(data){ 
     data = data[0]; 
     price = data['price']; 
     def.resolve(price); 
    }).fail(function(){ 
     // do on error stuff 
    }); 

    return def.promise(); 
} 
// ... 
calculate_cost("large").done(function(price){ 
    alert(price); 
}).fail(function(){ 
    alert("Failed to retrieve price"); 
}); 
संबंधित मुद्दे