jquery - সাফল্যের এজ্যাক্স ফলাফল ব্যবহার করে ফেরতের মান


96

Jquery aj। Jax () ফাংশন নিয়ে আমার একটি ছোট সমস্যা আছে।

আমার একটি ফর্ম রয়েছে যেখানে রেডিও বোতামের প্রতিটি ক্লিক বা ড্রপডাউন মেনু থেকে নির্বাচন নির্বাচিত মান সহ একটি সেশন ভেরিয়েবল তৈরি করে।

এখন - আমার কাছে ড্রপডাউন মেনুগুলির মধ্যে একটি রয়েছে যার 4 টি বিকল্প রয়েছে - প্রথমটির (কোনওটি লেবেল নয়) এর একটি মান = "" অন্যের আইডি রয়েছে।

আমি যেটি ঘটতে চাই তা হল সেশনটি অপসারণ এবং একটি তৈরির জন্য অন্য কোনও বিকল্প নয় (ফাঁকা মান সহ), তবে কেবলমাত্র যদি এই নির্দিষ্ট নির্বাচিত নামের সেশনটি ইতিমধ্যে উপস্থিত না থাকে - অন্য সমস্ত বিকল্পের কাছে এটির পরিমাণ একই হিসাবে নির্ধারিত রয়েছে - এটি কেবল ইঙ্গিত দিচ্ছে যে কোনটি নির্বাচন করা হয়েছিল।

এটি নিশ্চিত হয়ে যায় কিনা তা সম্পর্কে আমি নিশ্চিত নই - তবে কোডটি একবার দেখুন - সম্ভবত এটি আরও পরিষ্কার করে দেবে:

$("#add_ons select").change(function() {
        // get current price of the addons
        var order_price_addon = $(".order_price_addon").text();
        // get price of the clicked radio button from the rel attribute
        var add = $(this).children('option').attr('label');
        var name = $(this).attr('name');
        var val = $(this).val();


        if(val == "") {
            var price = parseInt(order_price_addon) - parseInt(add);
            removeSession(name);
        } else {
            if(isSession(name) == 0) {
                var price = parseInt(order_price_addon) + parseInt(add);
            }   
            setSession(name, val);              
        }

        $(".order_price_addon").html(price);    
        setSession('order_price_addon', price);         
        updateTotal();
});

সুতরাং - সবার আগে যখন # অ্যাডড_নোন মেনুগুলি "পরিবর্তন" নির্বাচন করে আমরা গণনার জন্য কয়েকটি উপাদান থেকে কিছু মান পাই।

আমরা আমাদের নির্বাচন থেকে বিকল্পটির লেবেল বৈশিষ্ট্যটি পাই যা মোটটিতে যোগ করার জন্য মানটি সঞ্চয় করে, এই নামটি দিয়ে সেশন তৈরি করতে নির্বাচনের নাম এবং পরে কোনটি নির্বাচিত হয়েছিল তা পরীক্ষা করে মান নির্ধারণ করুন।

এখন - আমরা পরীক্ষা করি যে ভাল == "" (যা নির্দেশ করে যে কোনটিই নির্বাচন করা হয়নি) এবং আমরা মোটটি থেকে পরিমাণটি কেটে নেব পাশাপাশি নির্বাচনের নাম সহ সেশনটি সরিয়ে ফেলব।

এটির পরে সমস্যাটি শুরু হয় - অন্য বিবৃতি।

অন্যথায় - আমরা আমাদের নির্বাচকটির নামের সাথে সেশন () ফাংশনটি 0 বা 1 প্রদান করে কিনা তা খতিয়ে দেখতে চাই - যদি এটি 0 প্রদান করে তবে আমরা লেবেল বৈশিষ্ট্যে সংরক্ষিত মোট মানটিতে যুক্ত করব, তবে যদি এটি 1 প্রদান করে - যা প্রস্তাব দেয় এই অধিবেশনটি ইতিমধ্যে বিদ্যমান - তবে আমরা কেবলমাত্র এই পুনরায় তৈরি করে এই সেশনের মান পরিবর্তন করি - তবে পরিমাণটি এতে যুক্ত হয় না।

এখন সেশন ফাংশনটি দেখতে এরকম দেখাচ্ছে:

function isSession(selector) {
    $.ajax({
        type: "POST",
        url: '/order.html',
        data: ({ issession : 1, selector: selector }),
        dataType: "html",
        success: function(data) {
            return data;
        },
        error: function() {
            alert('Error occured');
        }
    });
}

এখন - সমস্যাটি হ'ল - "রিটার্ন" ব্যবহার করে ফাংশন থেকে ফলাফলটি ফিরে আসবে কিনা তা আমি জানি না - যেমনটি কাজ করে বলে মনে হচ্ছে না - তবে, যদি আমি সাফল্যে "ডেটা" রাখি: বিভাগটিতে সতর্কতা - এটি সঠিক মানটি ফেরত বলে মনে হচ্ছে।

কেউ কীভাবে ফাংশন থেকে মানটি ফেরত দিতে এবং পরবর্তী বিবৃতিতে এটি তুলনা করতে জানেন?


ধন্যবাদ বন্ধুরা - আমি এটি নিম্নলিখিত উপায়ে চেষ্টা করেছি:

function isSession(selector) {
    $.ajax({
        type: "POST",
        url: '/order.html',
        data: ({ issession : 1, selector: selector }),
        dataType: "html",
        success: function(data) {
            updateResult(data);
        },
        error: function() {
            alert('Error occured');
        }
    });
}

তারপরে আপডেট ফলাফল () ফাংশন:

ফাংশন আপডেট ফলাফল (ডেটা) {ফলাফল = ডেটা; }

ফলাফল - এটি বিশ্বব্যাপী পরিবর্তনশীল - যা আমি তখন পড়ার চেষ্টা করছি:

$("#add_ons select").change(function() {
        // get current price of the addons
        var order_price_addon = $(".order_price_addon").text();
        // get price of the clicked radio button from the rel attribute
        var add = $(this).children('option').attr('label');
        var name = $(this).attr('name');
        var val = $(this).val();


        if(val == "") {
            var price = parseInt(order_price_addon) - parseInt(add);
            removeSession(name);
        } else {
            isSession(name);
            if(result == 0) {
                var price = parseInt(order_price_addon) + parseInt(add);
            }   
            setSession(name, val);              
        }

        $(".order_price_addon").html(price);    
        setSession('order_price_addon', price);         
        updateTotal();
    });

কিন্তু কোনও কারণে - এটি কাজ করে না - কোনও ধারণা?



এটা তোলে সাহায্য করতে পারে এই সমস্যার সমাধান: stackoverflow.com/questions/14220321/...
mirzaei.sajad

উত্তর:


114

সমস্যাটি হ'ল আপনি এজেএক্স অনুরোধের মতো একটি অ্যাসিঙ্ক্রোনাস কল থেকে কোনও মূল্য ফেরত দিতে পারবেন না এবং এটি কাজ করবে বলে আশা করে।

কারণটি হচ্ছে প্রতিক্রিয়াটির জন্য অপেক্ষা করা কোডটি ইতিমধ্যে প্রতিক্রিয়া পাওয়ার সময়টির দ্বারা কার্যকর করা হয়েছে।

এই সমস্যার সমাধান প্রয়োজন কোড রান হয় ভিতরেsuccess: কলব্যাক। এই উপায়টি dataকেবল যখন উপলব্ধ থাকে তখন এটি অ্যাক্সেস করে ।

function isSession(selector) {
    $.ajax({
        type: "POST",
        url: '/order.html',
        data: ({ issession : 1, selector: selector }),
        dataType: "html",
        success: function(data) {
            // Run the code here that needs
            //    to access the data returned
            return data;
        },
        error: function() {
            alert('Error occured');
        }
    });
}

আরেকটি সম্ভাবনা (যা কার্যকরভাবে একই জিনিস) হ'ল আপনার success:কলব্যাকের অভ্যন্তরে এমন কোনও ফাংশন কল করা যা এটি উপলব্ধ হলে ডেটা পাস করে।

function isSession(selector) {
    $.ajax({
        type: "POST",
        url: '/order.html',
        data: ({ issession : 1, selector: selector }),
        dataType: "html",
        success: function(data) {
                // Call this function on success
            someFunction( data );
            return data;
        },
        error: function() {
            alert('Error occured');
        }
    });
}

function someFunction( data ) {
    // Do something with your data
}

12
আপনি একটি এজেএক্স অনুরোধ থেকে কোনও মান ফেরত দিতে পারেন, তবে কেবলমাত্র যদি আপনি এটি অ-অ্যাসিঙ্ক্রোনাস করেন (বিকল্পটি সেট করুন async: false)। কিছু ক্ষেত্রে, অ্যাসিক্রোনাস কল করার প্রয়োজন হয় না। Jquery.ajax () ডক্ট এপিআই.জ্যাকারি.com / jQuery.ajax এ আরও , এটি নয়As of jQuery 1.8, the use of async: false with jqXHR ($.Deferred) is deprecated;
অ্যাড্রিয়েন

50
"নন-অ্যাসিনক্রোনাস" অবশ্যই "সিঙ্ক্রোনাস" হিসাবেও উল্লেখ করা যেতে পারে;)
চার্লস উড

উভয় পদ্ধতিতে আপনি পরামর্শ দিয়েছেন; অর্থাত্ সাফল্যের সাথে ফাংশনটি চালান, তারপরে আপনাকে বিভিন্ন পরিস্থিতিতে একাধিক এজাক্স লিখতে হবে। এটি বিশ্বব্যাপী এজাক্স র‍্যাপার, ইঞ্জিন তৈরি করতে সহায়তা করবে না।
wpcoder

দেখে মনে হচ্ছে, অ্যাসিঙ্ক: মিথ্যাটি এখন অবচয় করা হয়েছে এবং সমস্ত প্রসেসিং কলব্যাক ফাংশনে করা দরকার।
পুনেত লাম্বা

33

JQuery AJAX প্রতিক্রিয়া পেতে অনেক উপায় আছে। আমি আপনার সাথে দুটি সাধারণ পন্থা ভাগ করছি:

প্রথম:

ব্যবহারের ASYNC মিথ্যা = এবং ফাংশন রিটার্ন Ajax-বস্তুর মধ্যে এবং পরে পেতে প্রতিক্রিয়া Ajax-object.responseText

/**
 * jQuery ajax method with async = false, to return response
 * @param  {mix}  selector - your selector
 * @return {mix}           - your ajax response/error
 */
function isSession(selector) {
    return $.ajax({
        type: "POST",
        url: '/order.html',
        data: {
            issession: 1,
            selector: selector
        },
        dataType: "html",
        async: !1,
        error: function() {
            alert("Error occured")
        }
    });
}
// global param
var selector = !0;
// get return ajax object
var ajaxObj = isSession(selector);
// store ajax response in var
var ajaxResponse = ajaxObj.responseText;
// check ajax response
console.log(ajaxResponse);
// your ajax callback function for success
ajaxObj.success(function(response) {
    alert(response);
});

দ্বিতীয়:

ex .exte মেথডটি ব্যবহার করুন এবং এজাক্সের মতো একটি নতুন ফাংশন তৈরি করুন

/**
 * xResponse function
 *
 * xResponse method is made to return jQuery ajax response
 * 
 * @param  {string} url   [your url or file]
 * @param  {object} your ajax param
 * @return {mix}       [ajax response]
 */
$.extend({
    xResponse: function(url, data) {
        // local var
        var theResponse = null;
        // jQuery ajax
        $.ajax({
            url: url,
            type: 'POST',
            data: data,
            dataType: "html",
            async: false,
            success: function(respText) {
                theResponse = respText;
            }
        });
        // Return the response text
        return theResponse;
    }
});

// set ajax response in var
var xData = $.xResponse('temp.html', {issession: 1,selector: true});

// see response in console
console.log(xData);

আপনি এটিকে নিজের মতো করে বড় করতে পারেন ...


ভাল ধারণা তবে ajaxObj['responseText']আপনি সংজ্ঞায়িত করার সময় অস্তিত্ব নেইvar ajaxResponse
mu3

পারফেক্ট !! আপনার প্রথম সমাধানটি আমাকে বাঁচিয়েছিল
কল্লেল ওমর 5'15

দ্বিতীয় পদ্ধতিটি 100% ঠিক আছে! ;)
শচাল কেউন

7
JQuery 1.8 হিসাবে, async এর ব্যবহার: মিথ্যা হ্রাস করা হয়েছে!
গাট্টিও

10

আমি উত্তরগুলি এখানে দেখেছি এবং সহায়ক হলেও এটি আমার ঠিক কোডটি পরিবর্তন করতে হওয়ায় আমি যা চেয়েছিলাম ঠিক সেগুলি ছিল না।

আমার জন্য যা কাজ করেছে, তা এই জাতীয় কিছু করছিল:

function isSession(selector) {
    //line added for the var that will have the result
    var result = false;
    $.ajax({
        type: "POST",
        url: '/order.html',
        data: ({ issession : 1, selector: selector }),
        dataType: "html",
        //line added to get ajax response in sync
        async: false,
        success: function(data) {
            //line added to save ajax response in var result
            result = data;
        },
        error: function() {
            alert('Error occured');
        }
    });
    //line added to return ajax response
    return result;
}

আশা কাউকে সাহায্য করে

আনাকিন


4
আপনি আসলে সবেমাত্র async বন্ধ করেছেন
ওয়েইজিং জিন লিন

5

যদিও ব্যবহার সম্পর্কে সমস্ত পন্থা async: false হ্রাস না হওয়ায় এবং পৃষ্ঠায় আটকে থাকা অবধি অনুরোধটি ফিরে আসে না। সুতরাং এটি করার 2 উপায় এখানে:

1 ম: কোনও ফাংশনে পুরো এজাক্স প্রতিক্রিয়া ফিরিয়ে দিন এবং doneঅনুরোধটি শেষ হয়ে গেলে প্রতিক্রিয়া ক্যাপচার জন্য ফাংশনটি ব্যবহার করুন ((প্রস্তাবিত, সেরা উপায়)

function getAjax(url, data){
    return $.ajax({
        type: 'POST',
        url : url,              
        data: data,
        dataType: 'JSON',
        //async: true,  //NOT NEEDED
        success: function(response) {
            //Data = response;
        }
    });
 }

উপরের মত কল করুন:

getAjax(youUrl, yourData).done(function(response){
    console.log(response);
});

একাধিক আজাক কল এর ব্যবহার করুন $.when:

$.when( getAjax(youUrl, yourData), getAjax2(yourUrl2, yourData2) ).done(function(response){
    console.log(response);
});

২ য়: প্রতিক্রিয়াটি কোনও কুকিতে সংরক্ষণ করুন এবং তারপরে এজাক্স কলের বাইরে সেই কুকির মান পান RE (প্রস্তাবিত নয়)

        $.ajax({
            type: 'POST',
            url : url,              
            data: data,
            //async: false,    // No need to use this
            success: function(response) {
                Cookies.set(name, response);
            }
        });

        // Outside of the ajax call
        var response = Cookies.get(name);

দ্রষ্টব্য: উপরের উদাহরণে jquery cookiesলাইব্রেরিটি ব্যবহৃত হয়েছে t এটি বেশ লাইটওয়েট এবং চটকদার হিসাবে কাজ করে। এখানে লিঙ্কটি https://github.com/js-cookie/js-cookie


3

যোগ async: falseআপনার বৈশিষ্ট্যাবলী লিস্টে। এটি জাভাস্ক্রিপ্ট থ্রেডটি এগিয়ে যাওয়ার আগে ফেরতের মান পুনরুদ্ধার হওয়া পর্যন্ত অপেক্ষা করতে বাধ্য করে। স্পষ্টতই, আপনি প্রতিটি পরিস্থিতিতে এটি করতে চাইবেন না, তবে এগিয়ে যাওয়ার আগে যদি কোনও মান প্রয়োজন হয়, এটি এটি করবে।


4
আপনার কখনই সেট করা উচিত নয় async: false। এটি পুনরুদ্ধারের সময়কালের জন্য পৃষ্ঠাটিতে ইরিচিংকে ব্লক করে। আপনি জানেন যে এজেএক্স-এ এর অর্থ কী: অ্যাসিনক্রোনাস। সঠিক উত্তরটি হ'ল ওপিকে success()কলব্যাক সঠিকভাবে ব্যবহার করা দরকার ।
nietonfir

4
আমি সত্যটি স্বীকার করেছি যে সবকিছু অপেক্ষা করতে হবে। নির্দিষ্ট পরিস্থিতিতে, কলিং ফাংশনটির জন্য একটি ফেরত মান প্রয়োজন হতে পারে, যেমন একটি নতুন রেকর্ড যুক্ত করা এবং কোনও রেকর্ড আইডি ফেরতের প্রয়োজন। একবার আপনি নিয়মগুলি জানার পরে, আপনি জানেন যে সেগুলি কখন ভেঙে যেতে পারে। কখনও না বল না. এখানে অন্য কেউ যারা সম্মত হন। ( স্ট্যাকওভারফ্লো.com / জিজ্ঞাসা / 3880361/… )
হুডলাম

4
@ চারলেস উড একাই তাদের জন্য যারা অজ্যাক্সের অ্যাসিঙ্ক প্রকৃতিটি উপলব্ধি করতে পারবেন না।
nietonfir

4
@ নীটনফির: আপনি যদি কখনও ব্যবহার async: falseনা করেন তবে jQuery কেন এই বিকল্পটি প্রয়োগ করে? যদি আমি পৃষ্ঠায় বড় পরিমাণে ডেটা লোড না করে এবং কেবল কোনও ব্যবহারকারীর ইভেন্ট হ্যান্ডেল করি তবে ঠিক যে এটি সেই নির্দিষ্ট ব্যবহারকারীর জন্য স্বল্প সময়ের মধ্যে সমস্ত কিছুকে অবরুদ্ধ করে দেয়। কিছুই ভুল এবং খারাপ কিছুই। (যদি সঠিকভাবে ব্যবহৃত হয় তবে এটি কোনও কিছুই ব্লক করবে না কারণ সেই নির্দিষ্ট সময়ে সেই নির্দিষ্ট ব্যবহারকারীর জন্য অন্য কোনও ক্রিয়াকলাপ ঘটবে না)
কম_প্রিয়

4
@ উত্তরথিল্ডনান না, এটি ঠিক নেই। একটি সিঙ্ক এজেএক্স অনুরোধটি খারাপ। এটি পুরো জাভাস্ক্রিপ্ট থ্রেডকে এমন কিছু দ্বারা অবরুদ্ধ করে যা আপনি নিয়ন্ত্রণ করতে পারবেন না। অনুরোধটি প্রক্রিয়া করতে আপনার যতটা সময় লাগতে পারে তার নিয়ন্ত্রণ আপনার নেই: সংযোগটি অবিশ্বাস্য হতে পারে, সার্ভারটি প্রত্যাশার চেয়ে বেশি সময় নিতে পারে, ইত্যাদি । jQuery এ কেবলমাত্র কারণটি আপনাকে ডেটা সংরক্ষণ করার প্রয়োজন হতে পারে পৃষ্ঠায় আনলোড (একমাত্র জায়গা এটি বেশি সময় নেয় কিনা তা সত্যিকার অর্থে গুরুত্বপূর্ণ নয়, কারণ ব্যবহারকারী ইতিমধ্যে পৃষ্ঠাটি ছাড়ার ইচ্ছা প্রকাশ করেছিলেন)। শুধু jQuery ইউনিট পরীক্ষা দেখুন ...
nietonfir

3

এটি বেশ পুরানো, এবং কুরুচিপূর্ণ, এটি করবেন না। আপনার কলব্যাকগুলি ব্যবহার করা উচিত: https://stackoverflow.com/a/5316755/591257
একই সমস্যা ছিল, এটি একটি বিশ্বব্যাপী ভেরি ব্যবহার করে এভাবে সমাধান করুন। নিশ্চিত না যে এটি সর্বোত্তম তবে অবশ্যই কাজ করে। ত্রুটিতে আপনি একটি খালি স্ট্রিং পান (মাইভার = ''), যাতে আপনি এটি প্রয়োজন হিসাবে পরিচালনা করতে পারেন।

var myVar = '';
function isSession(selector) {
  $.ajax({
    'type': 'POST',
    'url': '/order.html',
    'data': {
      'issession': 1,
      'selector': selector
    },
    'dataType': 'html',
    'success': function(data) {
      myVar = data;
    },
    'error': function() {
      alert('Error occured');
    }
  });
  return myVar;
}

4
আপনার এখানেও যুক্ত করতে হবে async: false, কারণ অ্যাসিঙ্ক্রোনাস-মোডে এটির নিশ্চয়তা নেই যা ফেরার আগে dataসংরক্ষণ করা myVarহয়েছিল myVar
low_rents

2
// Common ajax caller
function AjaxCall(url,successfunction){
  var targetUrl=url;
  $.ajax({
    'url': targetUrl,
    'type': 'GET',
    'dataType': 'json',
    'success': successfunction,
    'error': function() {
      alert("error");
    }
  });
}

// Calling Ajax
$(document).ready(function() {
  AjaxCall("productData.txt",ajaxSuccessFunction);
});

// Function details of success function
function ajaxSuccessFunction(d){
  alert(d.Pioneer.Product[0].category);
}

এটি সাহায্য করতে পারে, একটি সাধারণ এজ্যাক্স কল ফাংশন তৈরি করতে পারে এবং এমন একটি ফাংশন সংযুক্ত করে যা অজ্যাক্স কলকে সাফল্যের সাথে ডাকে, উদাহরণটি দেখুন


1

এখান থেকে সহায়তা নিয়ে

function get_result(some_value) {
   var ret_val = {};
   $.ajax({
       url: '/some/url/to/fetch/from',
       type: 'GET',
       data: {'some_key': some_value},
       async: false,
       dataType: 'json'
   }).done(function (response) {
       ret_val = response;
   }).fail(function (jqXHR, textStatus, errorThrown) {
           ret_val = null;
       });
   return ret_val;
}

আশা করি এটি কাউকে কিছুটা সাহায্য করবে helps


এর ব্যবহার async: false,প্রাগৈতিহাসিক এবং jQuery v1.8 সাল থেকে অবহেলা করা হয়েছে, এটি সম্ভবত কারও সাহায্য করবে না
অ্যালন এটান

-2

হাই অ্যাসিঙ্ক ট্রাই করুন: আপনার অজ্যাক্স কলটিতে মিথ্যা ..

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.