একটি অ্যাসিঙ্ক্রোনাস জাভাস্ক্রিপ্ট ফাংশন সিঙ্ক্রোনসি কল করুন


221

প্রথমত, এটি একটি অত্যন্ত সিঙ্ক্রোনাস কোডবেসে অ্যাসিঙ্ক্রোনাস কলটি পুনরায় প্রেরণ করার উদ্দেশ্যে উদ্দেশ্য করে ভুল পদ্ধতিতে করা এটি একটি খুব সুনির্দিষ্ট কেস যা বর্তমানে "হাজারে লাইন দীর্ঘ এবং সময়" পরিবর্তনগুলি করার ক্ষমতা রাখে না এটি ঠিক." এটি আমার সত্তার প্রতিটি ফাইবারকে আঘাত করে তবে বাস্তবতা এবং আদর্শগুলি প্রায়শই জাল হয় না। আমি জানি এই স্তন্যপান।

ঠিক আছে, উপায় ছাড়াই, আমি কীভাবে এটি তৈরি করব যাতে আমি পারতাম:

function doSomething() {

  var data;

  function callBack(d) {
    data = d;
  }

  myAsynchronousCall(param1, callBack);

  // block here and return data when the callback is finished
  return data;
}

উদাহরণগুলি (বা এর অভাব) সমস্ত গ্রন্থাগার এবং / অথবা সংকলক ব্যবহার করে, উভয়ই এই সমাধানের পক্ষে কার্যকর নয়। আমি কীভাবে এটি ব্লক করব (যেমন কলব্যাক না বলা পর্যন্ত ডসমিংথিং ফাংশনটি ছেড়ে যাবেন না) এর একটি কন্ট্রাক্ট উদাহরণ আমার প্রয়োজন W জেএসে যদি এমন বিষয় সম্ভব হয়।


16
ব্রাউজারটিকে ব্লক করা এবং অপেক্ষা করা সহজভাবে সম্ভব নয়। তারা কেবল এটি করবে না।
পয়েন্টি

2
বেশিরভাগ ব্রাউজারগুলিতে জাভাস্ক্রিপ্ট দস্তাবেজ অবরুদ্ধ করার পদ্ধতি রয়েছে ... আপনি যখন একটি এসিঙ্ক কল ডেটা ফিরিয়ে দিতে শেষ করেন তখন কল কলব্যাক তৈরি করতে চান
নাদির মুজাফফার

8
আপনি ব্রাউজারটি বলার উপায় জিজ্ঞাসা করছেন "আমি জানি আমি আপনাকে পূর্ববর্তী ফাংশনটি অযৌক্তিকভাবে চালনার জন্য বলেছি, তবে আমি আসলে এটি বোঝাতে চাই নি!"! আপনি এমনকি কেন এটি সম্ভব হবে আশা করবেন ?
ওয়েইন

2
সম্পাদনার জন্য ড্যান ধন্যবাদ। আমি কঠোরভাবে অভদ্র হচ্ছিলাম না, তবে আপনার কথাটি ভাল।
রবার্ট সি বার্থ

2
@ রবার্টসি.বার্থ এটি এখন জাভাস্ক্রিপ্টের মাধ্যমেও সম্ভব। অ্যাসিঙ্ক অপেক্ষার কার্যগুলি এখনও স্ট্যান্ডার্ডে অনুমোদন করা হয়নি, তবে ES2017 এ থাকার পরিকল্পনা রয়েছে। আরও বিস্তারিত জানার জন্য নীচে আমার উত্তর দেখুন।
জন

উত্তর:


135

"আমাকে কীভাবে" সঠিক উপায়ে "বা যা কিছু করা উচিত তা সম্পর্কে বলবেন না"

ঠিক আছে. তবে আপনার এটি সত্যই সঠিকভাবে করা উচিত ... বা যাই হোক না কেন

"এটি কীভাবে ব্লক করা যায় তার একটি দৃ concrete় উদাহরণ আমার দরকার ... ইউআই জমা করে দেওয়া ছাড়া W জেএসে যদি এ জাতীয় জিনিস সম্ভব হয়।"

না, ইউআইকে ব্লক না করে চলমান জাভাস্ক্রিপ্টটি ব্লক করা অসম্ভব।

তথ্যের অভাব বিবেচনা করে সমাধানটি সরবরাহ করা শক্ত, তবে একটি বিকল্প হতে পারে কলিং ফাংশনটিতে বৈশ্বিক পরিবর্তনশীল পরীক্ষা করার জন্য কিছু পোলিং করা, তারপরে গ্লোবালটিতে কলব্যাক সেট করা থাকতে dataপারে।

function doSomething() {

      // callback sets the received data to a global var
  function callBack(d) {
      window.data = d;
  }
      // start the async
  myAsynchronousCall(param1, callBack);

}

  // start the function
doSomething();

  // make sure the global is clear
window.data = null

  // start polling at an interval until the data is found at the global
var intvl = setInterval(function() {
    if (window.data) { 
        clearInterval(intvl);
        console.log(data);
    }
}, 100);

এই সমস্ত অনুমান করে যে আপনি সংশোধন করতে পারেন doSomething()। আমি জানি না যে এটি কার্ডগুলিতে রয়েছে কিনা।

যদি এটি সংশোধন করা যায়, তবে কেন আপনি কেবল একটি কলব্যাক পাস করবেন না তা আমি জানি না doSomething() অন্য কলব্যাক থেকে কল পেতে করেননি, তবে আমি সমস্যায় পড়ার আগেই আরও ভাল করে থামি। ;)


ওহ, কি হ্যাক। আপনি একটি উদাহরণ দিয়েছেন যা পরামর্শ দেয় এটি সঠিকভাবে করা যায়, সুতরাং আমি সেই সমাধানটি দেখাব ...

function doSomething( func ) {

  function callBack(d) {
    func( d );
  }

  myAsynchronousCall(param1, callBack);

}

doSomething(function(data) {
    console.log(data);
});

আপনার উদাহরণটিতে একটি কলব্যাক অন্তর্ভুক্ত রয়েছে যা অ্যাসিঙ্ক কলটিতে পাঠানো হয়েছে, সঠিক উপায়টি হ'ল doSomething()কলব্যাক থেকে প্রার্থনা করার জন্য কোনও ফাংশনটি পাস করা।

অবশ্যই যদি কলব্যাকটি কেবল এটিই করে তবে আপনি funcসরাসরি পাস করতেন ...

myAsynchronousCall(param1, func);

22
হ্যাঁ, আমি এটি সঠিকভাবে কীভাবে করতে হয় তা আমার জানা দরকার, নির্দিষ্ট কারণে নির্দিষ্টভাবে বলা হয়েছে যে এটি / কীভাবে ভুলভাবে করা যেতে পারে। কর্সটি হ'ল মায়াসিনক্রোনসক্যাল কলব্যাক ফাংশনে কলটি শেষ না করা পর্যন্ত আমি ডসোমিংথিং () ছাড়তে চাই না। ব্লেহ, এটি করা যায় না, যেমন আমার সন্দেহ হয়েছিল, আমার ব্যাক আপ করার জন্য আমার কেবল ইন্টারনেটসের সংগৃহীত বুদ্ধি দরকার। ধন্যবাদ. :-)
রবার্ট সি বার্থ

2
@ রবার্টসি.বার্থ: হ্যাঁ, আপনার সন্দেহগুলি দুর্ভাগ্যক্রমে সঠিক হয়েছিল।

এটি কি আমি বা শুধুমাত্র "সঠিকভাবে সম্পন্ন" সংস্করণটির কাজ? প্রশ্নটিতে একটি রিটার্ন কল অন্তর্ভুক্ত ছিল, যার আগে এমন কিছু হওয়া উচিত যা এসিঙ্ক কল শেষ হওয়ার জন্য অপেক্ষা করে, যা এই উত্তরের এই প্রথম অংশটি কভার করে না ...
রাভেমির

@ ইরভেমির: উত্তরে বলা হয়েছে যে তিনি যা চান তা করা সম্ভব নয় । এটি বুঝতে গুরুত্বপূর্ণ অংশ। অন্য কথায়, আপনি অ্যাসিঙ্ক্রোনাস কল করতে পারবেন না এবং ইউআইকে অবরুদ্ধ না করে কোনও মান ফিরিয়ে দিতে পারবেন না। সুতরাং প্রথম সমাধানটি হ'ল একটি পরিবর্তনশীল হ্যাক যা বিশ্বব্যাপী ভেরিয়েবল ব্যবহার করে এবং পোলিংটি পরিবর্তনশীল হয়েছে কিনা তা দেখার জন্য polling দ্বিতীয় সংস্করণটি সঠিক উপায়।

1
@ লিওনার্দো: এটি প্রশ্নে বলা রহস্যজনক ফাংশন। মূলত এটি এমন কোনও কিছুর প্রতিনিধিত্ব করে যা সংকেত হিসাবে কোড চালায় এবং এমন একটি ফলাফল তৈরি করে যা গ্রহণ করা প্রয়োজন। সুতরাং এটি একটি এজেএক্স অনুরোধের মতো হতে পারে। আপনি ফাংশনটিতে callbackফাংশনটি পাস করেন myAsynchronousCallযা এটির অ্যাসিঙ্ক স্টাফ করে এবং সম্পূর্ণ হওয়ার পরে কলব্যাকের ডাক দেয়। এখানে একটি ডেমো রয়েছে।

60

ES2017 এর একটি বৈশিষ্ট্য অ্যাসিঙ্ক ফাংশন , প্রতিশ্রুতি ( অ্যাসিঙ্ক কোডের একটি নির্দিষ্ট ফর্ম) এবং awaitকীওয়ার্ড ব্যবহার করে অ্যাসিঙ্ক কোডটিকে সিঙ্ক তৈরি করে । এছাড়াও কীওয়ার্ডের asyncসামনের কীওয়ার্ডের নীচে কোড উদাহরণগুলিতে লক্ষ্য করুন functionযা একটি async / প্রতীক্ষা ফাংশনটিকে বোঝায়। awaitশব্দ একটি ফাংশন সঙ্গে প্রাক নির্দিষ্ট হচ্ছে ছাড়া কাজ করবে না asyncশব্দ। যেহেতু বর্তমানে এর ব্যতিক্রম নেই তার অর্থ কোনও শীর্ষ স্তরের অপেক্ষা করা কাজ করবে না (শীর্ষ স্তরের অপেক্ষার অর্থ কোনও ফাংশনের বাইরে অপেক্ষা করা)। যদিও শীর্ষ-স্তরের প্রস্তাব রয়েছেawait

ES2017 বিষয়টিকে স্বীকৃতি দেওয়া হয় (অর্থাত চূড়ান্ত) জুন 27 শে জাভাস্ক্রিপ্ট জন্য আদর্শ হিসাবে, 2017. এসিঙ্ক অপেক্ষায় রয়েছেন may ইতিমধ্যেই আপনার ব্রাউজারে কাজ, কিন্তু যদি না আপনি এখনও মত একটি জাভাস্ক্রিপ্ট transpiler ব্যবহার কার্যকারিতা ব্যবহার করতে পারেন Babel বা traceur । ক্রোম 55 এর অ্যাসিঙ্ক ফাংশনগুলির সম্পূর্ণ সমর্থন রয়েছে। সুতরাং আপনার যদি নতুন ব্রাউজার থাকে তবে আপনি নীচের কোডটি ব্যবহার করে দেখতে সক্ষম হতে পারেন।

দেখুন kangax এর es2017 সামঞ্জস্য টেবিলব্রাউজারের সামঞ্জস্যের জন্য ।

এখানে অ্যাসিঙ্কের অপেক্ষার ফাংশনটির একটি উদাহরণ বলা হয়েছে doAsyncযা শুরু থেকে তিনটি এক সেকেন্ড বিরতি নেয় এবং প্রতিটি বিরতির পরে সময়ের পার্থক্য মুদ্রণ করে:

function timeoutPromise (time) {
  return new Promise(function (resolve) {
    setTimeout(function () {
      resolve(Date.now());
    }, time)
  })
}

function doSomethingAsync () {
  return timeoutPromise(1000);
}

async function doAsync () {
  var start = Date.now(), time;
  console.log(0);
  time = await doSomethingAsync();
  console.log(time - start);
  time = await doSomethingAsync();
  console.log(time - start);
  time = await doSomethingAsync();
  console.log(time - start);
}

doAsync();

প্রত্যাশিত কীওয়ার্ডটি যখন প্রতিশ্রুতি মানের আগে স্থাপন করা হয় (এই ক্ষেত্রে প্রতিশ্রুতির মানটি ফাংশন ডসোমিংথিংসেঙ্ক দ্বারা ফিরিয়ে দেওয়া মান হয়) প্রতীক্ষিত কীওয়ার্ডটি ফাংশন কলটির কার্যকারিতা থামিয়ে দেবে, তবে এটি অন্য কোনও ক্রিয়াকলাপ থামিয়ে দেয় না এবং এটি অবিরত থাকবে প্রতিশ্রুতি সমাধান না হওয়া পর্যন্ত অন্যান্য কোড কার্যকর করা। প্রতিশ্রুতি সংশোধন করার পরে এটি প্রতিশ্রুতির মানটি আবদ্ধ করবে এবং আপনি এখন অপেক্ষা করা এবং প্রতিশ্রুতি প্রকাশের কথা ভাবতে পারেন যেহেতু সেই আনারপ্যাড মানটি প্রতিস্থাপন করা হচ্ছে।

সুতরাং, যেহেতু অপেক্ষা করুন কেবলমাত্র বিরতি অপেক্ষা করুন তারপরে লুপ এবং অভ্যন্তরীণ ফাংশন কলের জন্য এটি ব্যবহার করতে পারেন বাকী রেখার চালানোর আগে একটি মান আনপ্রেপ করে যা নীচে উদাহরণস্বরূপ যা অ্যারেতে অপেক্ষা করা সময়ের পার্থক্য সংগ্রহ করে এবং অ্যারেটি মুদ্রণ করে।

function timeoutPromise (time) {
  return new Promise(function (resolve) {
    setTimeout(function () {
      resolve(Date.now());
    }, time)
  })
}

function doSomethingAsync () {
  return timeoutPromise(1000);
}

// this calls each promise returning function one after the other
async function doAsync () {
  var response = [];
  var start = Date.now();
  // each index is a promise returning function
  var promiseFuncs= [doSomethingAsync, doSomethingAsync, doSomethingAsync];
  for(var i = 0; i < promiseFuncs.length; ++i) {
    var promiseFunc = promiseFuncs[i];
    response.push(await promiseFunc() - start);
    console.log(response);
  }
  // do something with response which is an array of values that were from resolved promises.
  return response
}

doAsync().then(function (response) {
  console.log(response)
})

অ্যাসিঙ্ক ফাংশনটি নিজেই একটি প্রতিশ্রুতি দেয় যাতে আপনি এটিকে শৃঙ্খলাবদ্ধ হয়ে প্রতিশ্রুতি হিসাবে ব্যবহার করতে পারেন যেমন আমি উপরে বা অন্য একটি অ্যাসিঙ্কের মধ্যে ফাংশনের জন্য অপেক্ষা করি।

উপরের ফাংশনটি অন্য অনুরোধ প্রেরণের আগে প্রতিটি প্রতিক্রিয়াটির জন্য অপেক্ষা করবে যদি আপনি একই সাথে অনুরোধগুলি প্রেরণ করতে চান তবে আপনি Promise.all ব্যবহার করতে পারেন ।

// no change
function timeoutPromise (time) {
  return new Promise(function (resolve) {
    setTimeout(function () {
      resolve(Date.now());
    }, time)
  })
}

// no change
function doSomethingAsync () {
  return timeoutPromise(1000);
}

// this function calls the async promise returning functions all at around the same time
async function doAsync () {
  var start = Date.now();
  // we are now using promise all to await all promises to settle
  var responses = await Promise.all([doSomethingAsync(), doSomethingAsync(), doSomethingAsync()]);
  return responses.map(x=>x-start);
}

// no change
doAsync().then(function (response) {
  console.log(response)
})

যদি প্রতিশ্রুতি সম্ভবত প্রত্যাখাত হয় আপনি এটিকে একটি চেষ্টা করে মুছে ফেলতে পারেন বা চেষ্টা করে ক্যাচ এড়িয়ে যেতে পারেন এবং ত্রুটিটি async / অপেক্ষার ফাংশনগুলি ধরার কলটিতে প্রচার করতে দিন। বিশেষত নোড.জেএস-এ প্রতিশ্রুতি ত্রুটিগুলি নিখরচায় না ফেলে আপনার সতর্ক হওয়া উচিত। নীচে কয়েকটি উদাহরণ দেওয়া আছে যা ত্রুটিগুলি কীভাবে কাজ করে তা দেখায়।

function timeoutReject (time) {
  return new Promise(function (resolve, reject) {
    setTimeout(function () {
      reject(new Error("OOPS well you got an error at TIMESTAMP: " + Date.now()));
    }, time)
  })
}

function doErrorAsync () {
  return timeoutReject(1000);
}

var log = (...args)=>console.log(...args);
var logErr = (...args)=>console.error(...args);

async function unpropogatedError () {
  // promise is not awaited or returned so it does not propogate the error
  doErrorAsync();
  return "finished unpropogatedError successfully";
}

unpropogatedError().then(log).catch(logErr)

async function handledError () {
  var start = Date.now();
  try {
    console.log((await doErrorAsync()) - start);
    console.log("past error");
  } catch (e) {
    console.log("in catch we handled the error");
  }
  
  return "finished handledError successfully";
}

handledError().then(log).catch(logErr)

// example of how error propogates to chained catch method
async function propogatedError () {
  var start = Date.now();
  var time = await doErrorAsync() - start;
  console.log(time - start);
  return "finished propogatedError successfully";
}

// this is what prints propogatedError's error.
propogatedError().then(log).catch(logErr)

আপনি যদি যান এখানে আপনি আসন্ন ECMAScript সংস্করণগুলির জন্য সমাপ্ত প্রস্তাবগুলি দেখতে পারেন।

জাস্ট ES2015 (ES6) এর সাথে ব্যবহার করা যেতে পারে এর একটি বিকল্প হ'ল একটি জেনারেটর ফাংশন মোড়ানো একটি বিশেষ ফাংশন ব্যবহার করা। জেনারেটর ফাংশনগুলিতে একটি ফলন কীওয়ার্ড থাকে যা আশেপাশের ফাংশনটির সাথে প্রতীক্ষিত কীওয়ার্ডটির প্রতিরূপ করতে ব্যবহৃত হতে পারে। ফলন কীওয়ার্ড এবং জেনারেটরের ফাংশনটি অনেক বেশি সাধারণ উদ্দেশ্য এবং আরও অনেক কিছু করতে পারে তারপরে অ্যাসিঙ্কের অপেক্ষার ফাংশনটি কেবল তাই করে। আপনি যদি এমন একটি জেনারেটর ফাংশন মোড়ক চান যা অ্যাসিঙ্কের অপেক্ষার প্রতিরূপ করতে ব্যবহৃত হতে পারে তবে আমি co.js পরীক্ষা করে দেখতে চাই । যাইহোক সহ-এর ফাংশন যেমন async এর প্রত্যাশায় ফাংশনগুলি প্রতিশ্রুতি ফেরায়। সত্যই যদিও এই মুহুর্তে ব্রাউজারের সামঞ্জস্যতা উভয় জেনারেটর ফাংশন এবং অ্যাসিঙ্ক ফাংশনগুলির জন্য সমান তাই আপনি যদি কেবল অ্যাসিঙ্ক কার্যকারিতার জন্য অপেক্ষা করেন তবে আপনাকে co.js ছাড়াই অ্যাসিঙ্ক ফাংশন ব্যবহার করা উচিত if

IE ব্যতীত সমস্ত বড় বর্তমান ব্রাউজারগুলিতে (ক্রোম, সাফারি এবং এজ) অ্যাসিঙ্ক ফাংশনগুলির জন্য ব্রাউজার সমর্থনটি এখন বেশ ভাল।


2
আমি এই উত্তর পছন্দ
ycomp

1
আমরা কতদূর এসেছি :)
ডেরেক

3
এটি দুর্দান্ত উত্তর, তবে মূল পোস্টারগুলির সমস্যার জন্য, আমি মনে করি এটি যা করে তা হ'ল সমস্যাটিকে এক স্তরের উপরে নিয়ে যাওয়া। বলুন তিনি ডোজ কিছুকে ভিতরে প্রতীক্ষার সাথে সাথে একটি অ্যাসিঙ্ক ফাংশনে পরিণত করেন into এই ফাংশনটি এখন একটি প্রতিশ্রুতি দেয় এবং অ্যাসিনক্রোনাস হয়, সুতরাং যে ফাংশনটি ডাকে তাকে আবারও একই সমস্যাটি মোকাবেলা করতে হবে।
dpwrselll

1
@dpwrselll এটি সত্য, কোড বেসে অ্যাসিঙ্ক ফাংশন এবং প্রতিশ্রুতির একটি হামাগুড়ি রয়েছে। সমস্ত কিছুতে ক্রাইপিং থেকে প্রতিশ্রুতি সমাধানের সর্বোত্তম উপায় হ'ল সিঙ্ক্রোনাস কলব্যাকগুলি লিখে সংলগ্নভাবে অ্যাসিঙ্ক মান ফিরিয়ে দেওয়ার কোনও উপায় নেই যদি আপনি এই টুইটার.com/sebmarkbage/status/941214259505119232 এর মতো অত্যন্ত উদ্ভট এবং বিতর্কিত কিছু না করেন যা আমি করি না সুপারিশ। আমি প্রশ্নের শিরোনামের উত্তর না দিয়ে প্রশ্নটির আরও পুরো উত্তর দেওয়ার জন্য প্রশ্নের শেষে একটি সম্পাদনা যুক্ত করব।
জন

এটি একটি দুর্দান্ত উত্তর +1 এবং সমস্ত, তবে যেমনটি লেখা আছে, আমি দেখতে পাচ্ছি না যে এটি কলব্যাকগুলি ব্যবহার করার চেয়ে কম জটিল।
অ্যালটিমাস প্রাইম

47

জিকুয়ের প্রতিশ্রুতি একবার দেখুন:

http://api.jquery.com/promise/

http://api.jquery.com/jQuery.when/

http://api.jquery.com/deferred.promise/

কোডটি রিফ্যাক্টর:

    var dfd = নতুন jQuery.Deferred ();


    ফাংশন কলব্যাক (ডেটা) {
       dfd.notify (ডাটা);
    }

    // অ্যাসিঙ্ক কল করুন।
    myAsynchronousCall (প্যারাম 1, কলব্যাক);

    ফাংশন ডসোমথিং (ডেটা) {
     // ডেটা দিয়ে স্টাফ করুন ...
    }

    $ .When (DFD) .then (doSomething);



3
এই উত্তরের জন্য +1, এটি সঠিক। যাইহোক, আমি সঙ্গে সঙ্গতিপূর্ণ আপডেট হবে dfd.notify(data)থেকেdfd.resolve(data)
জেসন

7
আসলে কোডটি কি অবিচ্ছিন্ন না হয়ে সিঙ্ক্রোনাস হওয়ার একটি ধারণা দেয়?
সৌরশজ

2
প্রতিশ্রুতিগুলি আইএমও হ'ল সুসংহত কলব্যাকস :) আপনার যদি অ্যাসিঙ্ক্রোনাস কলের প্রয়োজন হয় তবে কিছু প্রতিশ্রুতি আরম্ভ করার কথা বলা যাক, প্রতিশ্রুতিগুলি একটু পার্থক্য করে than
ওয়েবডুভেট

10
প্রতিশ্রুতিগুলি সিঙ্ক হয় না।
ভ্যান এস

6

সেখানে এক চমৎকার কার্যসংক্রান্ত নেই http://taskjs.org/

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

প্রকল্প গিটহাবের উদাহরণ কোড এখানে

var { Deferred } = task;

spawn(function() {
    out.innerHTML = "reading...\n";
    try {
        var d = yield read("read.html");
        alert(d.responseText.length);
    } catch (e) {
        e.stack.split(/\n/).forEach(function(line) { console.log(line) });
        console.log("");
        out.innerHTML = "error: " + e;
    }

});

function read(url, method) {
    method = method || "GET";
    var xhr = new XMLHttpRequest();
    var deferred = new Deferred();
    xhr.onreadystatechange = function() {
        if (xhr.readyState === 4) {
            if (xhr.status >= 400) {
                var e = new Error(xhr.statusText);
                e.status = xhr.status;
                deferred.reject(e);
            } else {
                deferred.resolve({
                    responseText: xhr.responseText
                });
            }
        }
    };
    xhr.open(method, url, true);
    xhr.send();
    return deferred.promise;
}

3

আপনি নোডজেএস-এ অ্যাসিঙ্ক্রোনাস জাভাস্ক্রিপ্টকে সমকালীন হতে বাধ্য করতে পারেন নোডজেএস-এ সিঙ্ক-আরপিসি-র

এটি অবশ্যই আপনার ইউআইটিকে হিমশীতল করে দেবে, সুতরাং শর্টকাটটি আপনার নেওয়া দরকার কী তা সম্ভব কিনা তা নিয়ে আমি এখনও একজন নায়াসেয়ার। জাভাস্ক্রিপ্টে ওয়ান ওয়ান থ্রেড স্থগিত করা সম্ভব নয়, এমনকি নোডজেএস আপনাকে মাঝে মাঝে এটিকে ব্লক করতে দেয়। কোনও কলব্যাকস, ইভেন্টস, অ্যাসিঙ্ক্রোনাসের কোনও কিছুই আপনার প্রতিশ্রুতি সমাধান না হওয়া পর্যন্ত প্রক্রিয়া করতে সক্ষম হবে না। সুতরাং যদি না আপনার পাঠকের ওপি (বা আমার ক্ষেত্রে, কোনও কলব্যাকস, ইভেন্ট ইত্যাদিসহ একটি গৌরবময় শেল স্ক্রিপ্ট লিখে না থাকে) এর মতো অনিবার্য পরিস্থিতি না থাকে, এটি করবেন না!

তবে আপনি এখানে এটি কীভাবে করতে পারেন তা এখানে:

./calling-file.js

var createClient = require('sync-rpc');
var mySynchronousCall = createClient(require.resolve('./my-asynchronous-call'), 'init data');

var param1 = 'test data'
var data = mySynchronousCall(param1);
console.log(data); // prints: received "test data" after "init data"

./my-asynchronous-call.js

function init(initData) {
  return function(param1) {
    // Return a promise here and the resulting rpc client will be synchronous
    return Promise.resolve('received "' + param1 + '" after "' + initData + '"');
  };
}
module.exports = init;

সীমাবদ্ধতা:

এগুলি উভয়ই কীভাবে sync-rpcবাস্তবায়িত হয় তার ফল , যা আপত্তিজনকভাবে require('child_process').spawnSync:

  1. এটি ব্রাউজারে কাজ করবে না।
  2. আপনার ফাংশনটিতে যুক্তিগুলি অবশ্যই ক্রমিক হতে হবে able আপনার যুক্তিগুলি বাইরে চলে যাবে JSON.stringify, সুতরাং ফাংশন এবং প্রোটোটাইপ চেইনের মতো অগণিত বৈশিষ্ট্যগুলি হারাবে।

1

আপনি এটিকে কলব্যাকে রূপান্তর করতে পারেন।

function thirdPartyFoo(callback) {    
  callback("Hello World");    
}

function foo() {    
  var fooVariable;

  thirdPartyFoo(function(data) {
    fooVariable = data;
  });

  return fooVariable;
}

var temp = foo();  
console.log(temp);

0

আপনি যা চান তা এখনই সম্ভব। আপনি যদি কোনও সার্ভিস ওয়ার্কারে অ্যাসিক্রোনাস কোড এবং ওয়েব ওয়ার্কারের সিঙ্ক্রোনাস কোড চালাতে পারেন তবে আপনি ওয়েব কর্মীকে সার্ভিস কর্মীর কাছে একটি সিঙ্ক্রোনাস এক্সএইচআর প্রেরণ করতে পারেন, এবং পরিষেবা কর্মী যখন অ্যাসিঙ্ক জিনিসগুলি করেন, ওয়েব কর্মীর থ্রেড অপেক্ষা করবে। এটি দুর্দান্ত পদ্ধতি নয়, তবে এটি কার্যকর হতে পারে।


-4

আপনি যে ধারণাটি অর্জন করবেন বলে আশা করছেন তা যদি আপনি কিছুটা সামান্য টুইট করেন তবে তা সম্ভব হয়ে উঠতে পারে

নীচের কোডটি সম্ভব যদি আপনার রানটাইম ES6 নির্দিষ্টকরণ সমর্থন করে।

অ্যাসিঙ্ক ফাংশন সম্পর্কে আরও

async function myAsynchronousCall(param1) {
    // logic for myAsynchronous call
    return d;
}

function doSomething() {

  var data = await myAsynchronousCall(param1); //'blocks' here until the async call is finished
  return data;
}

4
ফায়ারফক্স ত্রুটি দেয়: SyntaxError: await is only valid in async functions and async generators। প্যারাম 1 সংজ্ঞায়িত করা হয় না (এবং এমনকি ব্যবহৃত হয় না) তা উল্লেখ করার প্রয়োজন নেই।
হার্ভে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.