2012-07-02 9 views
7

ठीक से जारी रखने से पहले AJAX की प्रतीक्षा करें ... ठीक है ... 2 बजे, यह वह जगह है जहां मैं रेखा खींचता हूं। मदद करें ... इससे पहले कि मेरा लैपटॉप खिड़की से बाहर निकल जाए। :)अलग फ़ंक्शन

मैंने सेटटाइमर, कॉलबैक, और बाकी सब कुछ जो मैं सोच सकता हूं (पाठ्यक्रम के कुछ अन्य स्टैक ओवरफ्लो संकेतों के साथ) का उपयोग करने का प्रयास किया है। मैंने सब कुछ तोड़ दिया है इसलिए मैं सिर्फ बेस कोड छोड़ रहा हूं।

जो मैं करना चाहता हूं वह कॉल parseRow() है और अंत में रिकॉर्ड सहेजने से पहले, मुझे संबंधित श्रेणी (AJAX के माध्यम से) को पकड़ने की आवश्यकता है; हालांकि, यह ठीक से पहले उड़ाता है इसलिए श्रेणी हमेशा "अपरिभाषित" होती है।

function parseRow(row){ 
    var rowArray  = row.trim().split(","); 
    var date   = rowArray[0]; 
    var checknum  = rowArray[1]; 
    var payee  = rowArray[2]; 
    var memo   = rowArray[3]; 
    var amount  = rowArray[4]; 

    //ERROR: blows right past this one and sets the category variable BEFORE ajax returns 
    var category = autoSelectCategory(payee); 

    saveRecord(date, checkNum, payee, memo, category, payment, deposit); 
} 

function autoSelectCategory(payee) { 
    var data; 
    $.ajax({ 
     async: false, 
     url: "autoselectcategory", 
     dataType: "json", 
     data: { 
      string: payee 
     }, 
     success: function (returnedData) { 
      data = returnedData; 
     } 
    }); 
    return data; 
} 
+0

संपादित करें: - यह है कि मैं बहुत देर हो चुकी रहने के लिए क्या मिलता है मैं @ के अजीब सुझाव वह जवाब में किया penartur करने के जवाब देने के बाद से मैं एक मूर्ख था और डेटा ठीक से वापस नहीं किया था जोड़ा। उपरोक्त वास्तव में चाल अब करता है। हालांकि, मैं कॉलबैक लागू करने जा रहा हूं। – glassfish

उत्तर

12

AJAX अतुल्यकालिक के लिए खड़ा है। इसका मतलब है कि आपके मूल कोड में saveRecord को से पहले निष्पादित किया जाएगा, ग्राहक को सर्वर से प्रतिक्रिया प्राप्त होगी (और, $.ajax कार्यान्वयन के आधार पर, क्लाइंट सर्वर से अनुरोध भेजे जाने से पहले हो सकता है)।

इसके अतिरिक्त, आप गलत समझते हैं कि जेएस में फ़ंक्शन कैसे काम करते हैं। var category = autoSelectCategory(payee); श्रेणी को autoSelectCategory के वापसी मूल्य पर सेट करेगा; लेकिन आपके कोड में autoSelectCategory फ़ंक्शन कुछ भी नहीं देता है।

दूसरी तरफ से, अपने गुमनाम समारोह के data वापसी मान केवल $.ajax समारोह के द्वारा प्रयोग किया जा सकता है (और $.ajax संभावना success पैरामीटर वापसी मान पर ध्यान नहीं देता)।

function parseRow(row){ 
    var rowArray  = row.trim().split(","); 
    var date   = rowArray[0]; 
    var checknum  = rowArray[1]; 
    var payee  = rowArray[2]; 
    var memo   = rowArray[3]; 
    var amount  = rowArray[4]; 

    autoSelectCategory(payee, function (category) {  
     saveRecord(date, checkNum, payee, memo, category, payment, deposit); 
    }); 
} 

function autoSelectCategory(payee, callback) { 
    $.ajax({ 
     async: false, 
     url: "autoselectcategory", 
     dataType: "json", 
     data: { 
      string: payee 
     }, 
     success: callback 
    }); 
} 
+1

चूंकि वह 'async: false' का उपयोग कर रहा है, इसलिए वास्तव में' saveRecord' ** ** को '$ .ajax' से पहले निष्पादित नहीं किया जाएगा। वह * गलत रूप से वापस लौटने वाला मूल्य है। 'Var डेटा' को परिभाषित करना, '$ .ajax' से पहले, इसे 'सफलता' में सेट करना और' $ .ajax' के बाद लौटना चाहिए। फिर भी यह ** ** वास्तव में खराब ** अभ्यास 'async: false' का उपयोग करने के लिए अभ्यास करता है। – freakish

+0

@freakish मुझे 'async: false' नोटिस होना चाहिए था। यह भी पता नहीं था कि यह संभव है :) – penartur

+0

दोनों धन्यवाद! ठीक वही जो मेरे द्वारा खोजा जा रहा था! – glassfish

9

async: false विकल्प का उपयोग न करें:

यहाँ कोड है कि काम करना चाहिए है। यह एक शुद्ध बुराई है (ब्लॉक सभी ब्राउज़र में स्क्रिप्ट और यहां तक ​​कि अन्य टैब!) और यह jQuery 1.8 के बाद से हटा दिया गया है। आपको कॉलबैक का उपयोग करना चाहिए क्योंकि यह हमेशा होता था।

function parseRow(row) { 
    /* the other code */ 
    autoSelectCategory(payee, function() { 
     saveRecord(date, checkNum, payee, memo, category, payment, deposit); 
    }); 
} 

function autoSelectCategory(payee, callback) { // <---- note the additional arg 
    $.ajax({ 
     url: "autoselectcategory", 
     dataType: "json", 
     data: { 
      string: payee 
     }, 
     success: function(res) { 
      /* the other code */ 
      callback(); 
     } 
    }); 
} 
संबंधित मुद्दे