নোড.জেএস এর জন্য কীভাবে অ্যাসিঙ্ক্রোনাস ফাংশন লিখবেন


114

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

নোডের জন্য আমি কীভাবে অ্যাসিনক্রোনাস ফাংশন লিখব? আমি কীভাবে ত্রুটি ইভেন্ট পরিচালনা সঠিকভাবে বাস্তবায়ন করব?

আমার প্রশ্ন জিজ্ঞাসার আরেকটি উপায় হ'ল: নিম্নলিখিত ফাংশনটি কীভাবে ব্যাখ্যা করব?

var async_function = function(val, callback){
    process.nextTick(function(){
        callback(val);
    });
};

এছাড়াও, আমি এই প্রশ্নটি এসওতে খুঁজে পেয়েছি ("আমি কীভাবে নোড.জেএসসে একটি ব্লক-অ-ব্লকিং অ্যাসিক্রোনাস ফাংশন তৈরি করব?") আকর্ষণীয়। আমি এখনও উত্তর দেওয়া হয়েছে বলে মনে হয় না।


14
এজন্যই আমি জিজ্ঞাসা করছি। এই ফাংশনগুলি কীভাবে আলাদা তা আমার কাছে স্পষ্ট নয়।
ক্রিমে

আমি সুপারিশ আপনি তাকান setTimeoutএবং setIntervalআপনার প্রিয় ব্রাউজারে এবং তাদের সঙ্গে প্রায় পাশাপাশি খেলা এবং খেলার। বা এজাক্স কলব্যাকস (সম্ভবত নোডের অভিজ্ঞতার সবচেয়ে কাছের জিনিস), বা ইভেন্ট শ্রোতাদের কাছে যেমন আপনি ক্লিক এবং লোড ইভেন্টের সাথে পরিচিত things অ্যাসিঙ্ক্রোনাস মডেল ব্রাউজারে ইতিমধ্যে বিদ্যমান এবং তারা নোডে ঠিক একই রকম।
ডেভিন

@ ডেভিন - অনুমান করুন আমি তখন অ্যাসিক্রোনাস মডেলটি সম্পূর্ণরূপে বুঝতে পারি না।
ক্রিমে

@ ক্রেইম, আমি গতকাল এমন কিছু উত্তর দিয়েছি যা সহায়তা করতে পারে: stackoverflow.com/questions/6883648/… এটি আপনার প্রশ্নের উত্তর নয়, তবে এটি বিষয়বস্তু। প্রশ্নটি পড়ুন এবং সেখানে উত্তর দিন এবং কী চলছে তা বোঝার জন্য কোডটি নিয়ে খেলুন।
ডেভিন

2
@ রায়নস "অ্যাসিনক্রোনাস ফাংশন" এর সংজ্ঞা কী?
অ্যান্ডারসন সবুজ

উত্তর:


85

আপনি অ্যাসিঙ্ক্রোনাস ফাংশনগুলির সাথে অ্যাসিঙ্ক্রোনাস আইওকে বিভ্রান্ত করছেন বলে মনে হচ্ছে। নোড.জেএস অ্যাসিঙ্ক্রোনাস নন-ব্লকিং আইও ব্যবহার করে কারণ অ ব্লকিং আইও আরও ভাল। এটি বোঝার সর্বোত্তম উপায় হ'ল রায়ান ডাল দ্বারা কিছু ভিডিও দেখা।

নোডের জন্য আমি কীভাবে অ্যাসিনক্রোনাস ফাংশন লিখব?

কেবল সাধারণ ফাংশন লিখুন, পার্থক্য কেবল হ'ল এগুলি তাত্ক্ষণিকভাবে কার্যকর করা হয় না তবে কলব্যাক হিসাবে ঘুরে যায়।

ত্রুটি ইভেন্ট হ্যান্ডলিংয়ে আমার কীভাবে কার্যকর করা উচিত

সাধারণত এপিআই আপনাকে প্রথম যুক্তি হিসাবে একটি ত্রুটিযুক্ত কলব্যাক দেয়। উদাহরণ স্বরূপ

database.query('something', function(err, result) {
  if (err) handle(err);
  doSomething(result);
});

একটি সাধারণ প্যাটার্ন।

আর একটি সাধারণ প্যাটার্ন হ'ল on('error')। উদাহরণ স্বরূপ

process.on('uncaughtException', function (err) {
  console.log('Caught exception: ' + err);
});

সম্পাদনা:

var async_function = function(val, callback){
    process.nextTick(function(){
        callback(val);
    });
};

উপরের ফাংশন হিসাবে যখন ডাকা হয়

async_function(42, function(val) {
  console.log(val)
});
console.log(43);

42কনসোলকে অ্যাসিঙ্ক্রোনালি মুদ্রণ করবে । বিশেষ process.nextTickইভেন্টের পরে বর্তমান ইভেন্টলুপ কলস্ট্যাকটি খালি রয়েছে। যে কল স্ট্যাক পর খালি async_functionএবং console.log(43)ফেলেছেন। সুতরাং আমরা 43 টি পরে 42 অনুসরণ করি।

ইভেন্ট লুপটিতে আপনার সম্ভবত কিছু পড়া উচিত।


আমি দহল ভিডিগুলি দেখেছি, তবে আমি যে বিষয়টি ভীত তা নিয়ে আমার মনে হবে না বলে মনে হয়। :(
ক্রিম

1
@ ক্রিম আপডেট হওয়া উত্তরটি দেখুন এবং ইভেন্টটির লুপটি পড়ুন
রায়নস

1
ধন্যবাদ দুর্গ অন্তর্দৃষ্টি। আমার জ্ঞানের অভাব সম্পর্কে আমি এখন আরও সচেতন। :) আপনার শেষ উদাহরণটি সাহায্য করেছে।
ক্রিমে

আমি মনে করি আপনি অ্যাসিঙ্ক্রোনাস আইও সম্পর্কে বিবৃতিটি "সাধারণ" খুব সাধারণ। এই অর্থে হ্যাঁ, তবে সামগ্রিকভাবে এটি নাও হতে পারে।
জেক বি

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

9

কলব্যাক দিয়ে কেবল পাস করা যথেষ্ট নয়। ফাংশন অ্যাসিঙ্ক তৈরি করতে আপনাকে উদাহরণস্বরূপ সেটটিমার ব্যবহার করতে হবে।

উদাহরণ: অ্যাসিঙ্ক ফাংশন নয়:

function a() {
  var a = 0;    
  for(i=0; i<10000000; i++) {
    a++;
  };
  b();
};

function b() {
  var a = 0;    
  for(i=0; i<10000000; i++) {
    a++;
  };    
  c();
};

function c() {
  for(i=0; i<10000000; i++) {
  };
  console.log("async finished!");
};

a();
console.log("This should be good");

আপনি যদি উপরের উদাহরণটি চালনা করেন তবে এটি ভাল হওয়া উচিত, those ফাংশনগুলি কাজ শেষ না হওয়া অবধি অপেক্ষা করতে হবে।

সিউডো মাল্টিথ্রেড (অ্যাসিঙ্ক) ফাংশন:

function a() {
  setTimeout ( function() {
    var a = 0;  
    for(i=0; i<10000000; i++) {
      a++;
    };
    b();
  }, 0);
};

function b() {
  setTimeout ( function() {
    var a = 0;  
    for(i=0; i<10000000; i++) {
      a++;
    };  
    c();
  }, 0);
};

function c() {
  setTimeout ( function() {
    for(i=0; i<10000000; i++) {
    };
    console.log("async finished!");
  }, 0);
};

a();
console.log("This should be good");

এটি এক ট্রুলি অ্যাসিঙ্ক হবে। এ্যাসিঙ্ক শেষ হওয়ার আগে এটি ভাল লেখা উচিত writ



3

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

async function ace() {
  var r = await new Promise((resolve, reject) => {
    resolve(true)
  });

  console.log(r); // true
}

যদি কোনও ফাংশন কোনও প্রতিশ্রুতি না ফেরায়, তবে আমি আপনাকে এটি যে নতুন প্রতিশ্রুতি দিয়েছি তা মোড়ানোর পরামর্শ দিই, তারপরে আপনি যা ডেটা চান তা সমাধান করুন:

function ajax_call(url, method) {
  return new Promise((resolve, reject) => {
    fetch(url, { method })
    .then(resp => resp.json())
    .then(json => { resolve(json); })
  });
}

async function your_function() {
  var json = await ajax_call('www.api-example.com/some_data', 'GET');
  console.log(json); // { status: 200, data: ... }
}

নীচে লাইন: প্রতিশ্রুতি শক্তি লাভ।


এখানে মনে রাখার বিষয়টি হ'ল প্রতিশ্রুতিটি এখনও সিঙ্ক্রোনালি কার্যকর করা হয়।
छाया0359

2

এটি ব্যবহার করে দেখুন, এটি নোড এবং ব্রাউজার উভয়ের জন্যই কাজ করে।

isNode = (typeof exports !== 'undefined') &&
(typeof module !== 'undefined') &&
(typeof module.exports !== 'undefined') &&
(typeof navigator === 'undefined' || typeof navigator.appName === 'undefined') ? true : false,
asyncIt = (isNode ? function (func) {
  process.nextTick(function () {
    func();
  });
} : function (func) {
  setTimeout(func, 5);
});

18
4 টি ডাউনভোট এবং এমনকি একটি গঠনমূলক মন্তব্যও নয় ..: \
ওমর

6
@ ওমর এ রকমই জীবন।
পিস ডিজিটাল

6
@ নরবার্তোবেজি সম্ভবত কোডটি আপনার কাছে বর্ণনামূলক, তবে উত্তর পোস্ট করা ব্যক্তির পক্ষে নয়। এ কারণেই ডাউনটিভোটিংয়ের বিষয়ে ব্যাখ্যা করা সর্বদা একটি ভাল অনুশীলন।
ওমর

0

আমি node.js. তে এই জাতীয় কাজের জন্য অনেক ঘন্টা ব্যয় করেছি। আমি মূলত ফ্রন্ট-এন্ড লোক

আমি এটি বেশ গুরুত্বপূর্ণ বলে মনে করি, কারণ সমস্ত নোড পদ্ধতি কলব্যাকের সাথে অ্যাসিক্রোনাস লেনদেন করে এবং এটিকে প্রতিশ্রুতিতে রূপান্তরিত করে এটি পরিচালনা করা ভাল better

আমি কেবল একটি সম্ভাব্য ফলাফল দেখাতে চাই, আরও পাতলা এবং পঠনযোগ্য। ইসিএমএ -6 এসিঙ্কের সাহায্যে আপনি এটি এটি লিখতে পারেন।

 async function getNameFiles (dirname) {
  return new Promise((resolve, reject) => {
    fs.readdir(dirname, (err, filenames) => {
      err !== (undefined || null) ? reject(err) : resolve(filenames)
    })
  })
}

(undefined || null)জন্য repl এছাড়াও undefined কাজ ব্যবহার করে, (পড়ুন ঘটনা মুদ্রণ লুপ) পরিস্থিতিতে।

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