javascript - amsterdam - অ্যাজিক্রোনস, অ্যাজ্যাক্স অনুরোধের পরিবর্তে, আমি কীভাবে সিঙ্ক্রোনাস সঞ্চালন করতে পারি?




ajax fc (9)

আমার একটি জাভাস্ক্রিপ্ট উইজেট রয়েছে যা স্ট্যান্ডার্ড এক্সটেনশন পয়েন্ট সরবরাহ করে। তাদের মধ্যে একটি beforecreate ফাংশন। এটি তৈরি করা থেকে একটি আইটেম প্রতিরোধ false ফিরে করা উচিত।

আমি jQuery ব্যবহার করে এই ফাংশনে একটি অ্যাজাক্স কল যোগ করেছি:

beforecreate: function (node, targetNode, type, to) {
  jQuery.get('http://example.com/catalog/create/' + targetNode.id + '?name=' + encode(to.inp[0].value),

  function (result) {
    if (result.isOk == false) 
        alert(result.message);
  });
}

কিন্তু আমি আমার উইজেটটিকে আইটেমটি তৈরি থেকে আটকাতে চাই, তাই কলকাতায় নয়, তাই মা-ফাংশনে false ফিরিয়ে দিতে হবে। JQuery বা অন্য কোনও ব্রাউজার এপিআই ব্যবহার করে একটি সমলয় AJAX অনুরোধ সঞ্চালনের উপায় আছে?

https://code.i-harness.com


আপনি কলিং দ্বারা সিঙ্ক্রোনাস মোডে jQuery এর অ্যাজ্যাক্স সেটআপ রাখতে পারেন

jQuery.ajaxSetup({async:false});

এবং তারপর jQuery.get( ... ); ব্যবহার করে আপনার অ্যাজাক্স কলগুলি সম্পাদন করুন jQuery.get( ... );

তারপর শুধু একবার আবার চালু

jQuery.ajaxSetup({async:true});

আমি অনুমান করছি এটি @ এডাম দ্বারা প্রস্তাবিত একই জিনিসটি কাজ করে, তবে এটি এমন কোনও ব্যক্তির জন্য সহায়ক হতে পারে যা তাদের jQuery.get() বা jQuery.post() আরও বিস্তৃত jQuery.ajax() সিনট্যাক্সে jQuery.ajax()


আমি কার্সিওনের দেওয়া উত্তরটি ব্যবহার করেছি এবং JSON ব্যবহার করার জন্য এটি সংশোধন করেছি।

 function getUrlJsonSync(url){

    var jqxhr = $.ajax({
        type: "GET",
        url: url,
        dataType: 'json',
        cache: false,
        async: false
    });

    // 'async' has to be 'false' for this to work
    var response = {valid: jqxhr.statusText,  data: jqxhr.responseJSON};

    return response;
}    

function testGetUrlJsonSync()
{
    var reply = getUrlJsonSync("myurl");

    if (reply.valid == 'OK')
    {
        console.dir(reply.data);
    }
    else
    {
        alert('not valid');
    }    
}

আমি 'JSON' এর ডেটা টাইপ যুক্ত করেছি এবং প্রতিক্রিয়া JSON.responseText পরিবর্তন করেছি

আমি ফিরে বস্তুর statusText সম্পত্তি ব্যবহার করে অবস্থা পুনরুদ্ধার। দ্রষ্টব্য, এটি Ajax প্রতিক্রিয়া অবস্থা, JSON বৈধ কিনা তা নয়।

ব্যাক-এন্ডটি সঠিক (ভালভাবে তৈরি) JSON তে প্রতিক্রিয়াটি ফেরত দিতে হবে, অন্যথায় ফেরত দেওয়া বস্তুটিকে অনির্ধারিত করা হবে।

আসল প্রশ্নের উত্তর দেওয়ার সময় বিবেচনা করার দুটি দিক রয়েছে। এক অজ্যাককে একযোগে সঞ্চালন করতে বলছে ( অ্যাসাইন সেট করে : মিথ্যা ) এবং অন্যটি কলব্যাক ফাংশনে পরিবর্তে কলিং ফাংশনের রিটার্ন বিবৃতির মাধ্যমে প্রতিক্রিয়াটি ফেরত দিচ্ছে।

আমি পোষ্টের সাথে এটি চেষ্টা করেছি এবং এটি কাজ করেছে।

আমি জিইটি পরিবর্তন পোস্ট এবং যোগ তথ্য পরিবর্তন: পোস্টডাটা

function postUrlJsonSync(url, postdata){

    var jqxhr = $.ajax({
        type: "POST",
        url: url,
        data: postdata,
        dataType: 'json',
        cache: false,
        async: false
    });

    // 'async' has to be 'false' for this to work
    var response = {valid: jqxhr.statusText,  data: jqxhr.responseJSON};

    return response;
}

উল্লেখ্য যে উপরের কোড শুধুমাত্র অ্যাসাইনস মিথ্যা যেখানে ক্ষেত্রে কাজ করে। আপনি যদি অ্যাসাইন সেট করতে চান : সত্যই প্রত্যাবর্তিত বস্তু jqxhr AJAX কল ফেরৎ সময়ে কার্যকর হবে না, শুধুমাত্র পরে যখন অ্যাসিঙ্ক্রোনাস কল শেষ হয়ে গেছে, তবে প্রতিক্রিয়াশীল পরিবর্তন সেট করতে খুব দেরি হয়ে গেছে।


এই উদাহরণ:

$.ajax({
  url: "test.html",
  async: false
}).done(function(data) {
   // Todo something..
}).fail(function(xhr)  {
   // Todo something..
});

এই সমস্ত উত্তরগুলি বিন্দুটিকে মিস করে যে অ্যাসাইনস সহ একটি অজ্যাক্স কল করছে: মিথ্যা অ্যাক্সেস হওয়া পর্যন্ত ব্রাউজারটি ঝুলে থাকবে। একটি প্রবাহ নিয়ন্ত্রণ লাইব্রেরি ব্যবহার করে ব্রাউজার ঝুলন্ত ছাড়া এই সমস্যা সমাধান করবে। এখানে Frame.js সাথে একটি উদাহরণ রয়েছে:

beforecreate: function(node,targetNode,type,to) {

    Frame(function(next)){

        jQuery.get('http://example.com/catalog/create/', next);
    });

    Frame(function(next, response)){

        alert(response);
        next();
    });

    Frame.init();
}

চমৎকার সমাধান! আমি লক্ষ্য করলাম যখন আমি এটি বাস্তবায়ন করার চেষ্টা করেছি যে যদি আমি সাফল্যের ধারাটিতে একটি মান ফেরত পাঠাই, এটি অনির্ধারিত হিসাবে ফিরে এসেছে। আমি একটি পরিবর্তনশীল এটি সংরক্ষণ এবং যে পরিবর্তনশীল ফেরত ছিল। এই পদ্ধতির সাথে আমি এসেছি:

function getWhatever() {
  // strUrl is whatever URL you need to call
  var strUrl = "", strReturn = "";

  jQuery.ajax({
    url: strUrl,
    success: function(html) {
      strReturn = html;
    },
    async:false
  });

  return strReturn;
}

দ্রষ্টব্য: আপনি এই কারণে async ব্যবহার করা উচিত নয়:

গেকো 30.0 (ফায়ারফক্স 30.0 / থান্ডারবার্ড 30.0 / সিমনকি 2.27) দিয়ে শুরু হচ্ছে, ব্যবহারকারীর অভিজ্ঞতার নেতিবাচক প্রভাবগুলির কারণে প্রধান থ্রেডে সিঙ্ক্রোনাস অনুরোধগুলি অব্যবহৃত হয়েছে।

Chrome এমনকি কনসোলে এটি সম্পর্কে সতর্ক করে:

প্রধান ব্যবহারকারীর অভিজ্ঞতার ক্ষতিকারক প্রভাবগুলির কারণে প্রধান থ্রেডে সমলয় XMLHttpRequest অব্যবহৃত। আরও সহায়তার জন্য, https://xhr.spec.whatwg.org/ চেক করুন।

আপনি যদি এমন কিছু করছেন তবে এটি আপনার পৃষ্ঠাটি ভাঙ্গতে পারে কারণ এটি কোনও দিন কাজ বন্ধ করতে পারে।

যদি আপনি এটি এমন একটি উপায় করতে চান যা এখনও সিঙ্ক্রোনাস হিসাবে মনে হয় তবে এখনও তা অবরোধ না করে তবে আপনাকে অ্যাসাইন / অপেক্ষা এবং সম্ভবত কিছু অ্যাকজ্যাক ব্যবহার করতে হবে যা নতুন Fetch API

async function foo() {
  var res = await fetch(url)
  console.log(res.ok)
  var json = await res.json()
  console.log(json)
}

JQuery ডকুমেন্টেশন থেকে : আপনি একটি সমলয় অ্যাজাক্স অনুরোধ পেতে মিথ্যা হিসাবে অ্যাসিঙ্ক্রোনাস বিকল্পটি নির্দিষ্ট করুন। তারপর আপনার কলব্যাক আপনার মা ফাংশন আয় আগে কিছু তথ্য সেট করতে পারেন।

প্রস্তাবিত হিসাবে পরিবর্তন যদি আপনার কোড দেখতে হবে এখানে:

beforecreate: function (node, targetNode, type, to) {
    jQuery.ajax({
        url: 'http://example.com/catalog/create/' + targetNode.id + '?name=' + encode(to.inp[0].value),
        success: function (result) {
            if (result.isOk == false) alert(result.message);
        },
        async: false
    });
}

async: false সঙ্গে async: false আপনি নিজেকে একটি ব্লক ব্রাউজার পেতে। একটি অ ব্লকিং সমলয় সমাধান জন্য আপনি নিম্নলিখিত ব্যবহার করতে পারেন:

ES6 / ECMAScript2015

ES6 দিয়ে আপনি একটি জেনারেটর এবং সহ লাইব্রেরি ব্যবহার করতে পারেন:

beforecreate: function (node, targetNode, type, to) {
    co(function*(){  
        let result = yield jQuery.get('http://example.com/catalog/create/' + targetNode.id + '?name=' + encode(to.inp[0].value));
        //Just use the result here
    });
}

ES7

ES7 দিয়ে আপনি শুধু ASYC অপেক্ষা করতে পারেন:

beforecreate: function (node, targetNode, type, to) {
    (async function(){
        let result = await jQuery.get('http://example.com/catalog/create/' + targetNode.id + '?name=' + encode(to.inp[0].value));
        //Just use the result here
    })(); 
}

function getURL(url){
    return $.ajax({
        type: "GET",
        url: url,
        cache: false,
        async: false
    }).responseText;
}


//example use
var msg=getURL("message.php");
alert(msg);





asynchronous