আমি জাভাস্ক্রিপ্টে একটি "ফলন" কীওয়ার্ড সম্পর্কে শুনেছি, তবে আমি এটি সম্পর্কে খুব দুর্বল ডকুমেন্টেশন পেয়েছি। কেউ আমাকে এর ব্যাবহার (এবং ব্যাখ্যা করার জন্য কোনও সাইটের প্রস্তাব দিতে পারে) এবং এর জন্য কী ব্যবহার করা যেতে পারে?
আমি জাভাস্ক্রিপ্টে একটি "ফলন" কীওয়ার্ড সম্পর্কে শুনেছি, তবে আমি এটি সম্পর্কে খুব দুর্বল ডকুমেন্টেশন পেয়েছি। কেউ আমাকে এর ব্যাবহার (এবং ব্যাখ্যা করার জন্য কোনও সাইটের প্রস্তাব দিতে পারে) এবং এর জন্য কী ব্যবহার করা যেতে পারে?
উত্তর:
MDN ডকুমেন্টেশন প্রশংসনীয় ভাল, আইএমও হয়।
ফলন কীওয়ার্ড সহ ফাংশনটি একটি জেনারেটর। আপনি যখন এটিকে কল করবেন তখন এর আনুষ্ঠানিক পরামিতিগুলি প্রকৃত যুক্তির সাথে আবদ্ধ, তবে এর শরীরটি আসলে মূল্যায়ন করা হয় না। পরিবর্তে, একটি জেনারেটর-পুনরুক্তকারী ফিরে আসে। জেনারেটর-পুনরুক্তরের পরবর্তী () পদ্ধতিতে প্রতিটি কল পুনরাবৃত্ত অ্যালগরিদমের মাধ্যমে অন্য পাস করে। প্রতিটি পদক্ষেপের মান হ'ল ফলন কীওয়ার্ড দ্বারা নির্ধারিত মান। উত্সকে ফেরতের জেনারেটর-পুনরুক্তি সংস্করণ হিসাবে ভাবেন, অ্যালগরিদমের প্রতিটি পুনরাবৃত্তির মধ্যে সীমা নির্দেশ করে। প্রতিবার আপনি পরবর্তী () কল করবেন, জেনারেটর কোড ফলনের পরে বিবৃতি থেকে পুনরায় শুরু হয়।
দেরীতে উত্তর দেওয়া, সম্ভবত yield
এখন সকলেই জানেন তবে আরও ভাল কিছু ডকুমেন্টেশন এসেছে।
অফিসিয়াল হারমোনি স্ট্যান্ডার্ডের জন্য জেমস লং দ্বারা রচিত "জাভাস্ক্রিপ্টের ভবিষ্যত: জেনারেটর" থেকে একটি উদাহরণ মানিয়ে নেওয়া :
function * foo(x) {
while (true) {
x = x * 2;
yield x;
}
}
"আপনি যখন foo কল করেন, আপনি একটি জেনারেটর বস্তু ফিরে পাবেন যার পরবর্তী পদ্ধতি রয়েছে" "
var g = foo(2);
g.next(); // -> 4
g.next(); // -> 8
g.next(); // -> 16
এ yield
জাতীয় ধরণের return
: আপনি কিছু ফিরে পাবেন। return x
এর মান প্রদান করে x
তবে yield x
একটি ফাংশন প্রদান করে, যা আপনাকে পরবর্তী মানের দিকে পুনরাবৃত্তি করার একটি পদ্ধতি দেয়। আপনার যদি সম্ভাব্য মেমরির নিবিড় প্রক্রিয়া থাকে যা আপনি পুনরাবৃত্তির সময় বাধা দিতে পারেন।
function* foo(x){
সেখানে
*
টোকেন । আপনার কী প্রয়োজন বা না তা নির্ভর করে আপনি কী ধরনের ভবিষ্যত ফিরছেন তার উপর নির্ভর করে। বিশদটি দীর্ঘ: জিভিআর এটি পাইথন বাস্তবায়নের জন্য ব্যাখ্যা করেছে , যার ভিত্তিতে জাভাস্ক্রিপ্ট বাস্তবায়ন মডেল করা হয়েছে। ব্যবহার function *
সবসময় চেয়ে সামান্য বেশি ওভারহেড ঠিক হবে, যদিও কিছু ক্ষেত্রে function
সঙ্গে yield
।
function *
এবং এর মধ্যে পারস্পরিক সম্পর্কের মানকীকৃত করে এবং yield
উদ্ধৃত ত্রুটি যুক্ত করে ("একটি উত্পাদ বা ফলন * জেনারেটরের কোনও ক্রিয়াকলাপে প্রকাশ ঘটে তবে একটি প্রাথমিক ত্রুটি উত্থাপিত হয়")। তবে, ফায়ারফক্সে মূল জাভাস্ক্রিপ্ট ১.7 প্রয়োগকরণের প্রয়োজন*
পড়েনি । সেই অনুযায়ী উত্তর আপডেট। ধন্যবাদ!
এটি সত্যিই সহজ, এটি এটির মতো কাজ করে
yield
মূলশব্দটি কেবল অবিচ্ছিন্নভাবে যেকোনো সময় কোনও ফাংশন বিরতি দিতে এবং পুনরায় শুরু করতে সহায়তা করে ।এই সাধারণ জেনারেটরের ফাংশনটি নিন :
function* process() {
console.log('Start process 1');
console.log('Pause process2 until call next()');
yield;
console.log('Resumed process2');
console.log('Pause process3 until call next()');
let parms = yield {age: 12};
console.log("Passed by final process next(90): " + parms);
console.log('Resumed process3');
console.log('End of the process function');
}
চলুন _ প্রসেস = প্রক্রিয়া ();
যতক্ষণ না আপনি কল _process.next () এটা অভ্যস্ত চালানো প্রথম 2 লাইন কোডের, তারপর প্রথম ফলন হবে বিরাম ফাংশন। পরবর্তী বিরাম পয়েন্ট ( ফলন কীওয়ার্ড ) অবধি ফাংশনটি পুনরায় শুরু করতে আপনাকে _process.next () কল করতে হবে ।
আপনি একাধিক মনে করতে পারেন উৎপাদনের হয় ব্রেকপয়েন্ট একটি একক ফাংশন মধ্যে একটি JavaScript ডিবাগার হবে। যতক্ষণ না আপনি পরবর্তী ব্রেকপয়েন্টে নেভিগেট করতে বলুন এটি কোড ব্লকটি কার্যকর করবে না। ( দ্রষ্টব্য : পুরো অ্যাপ্লিকেশনটি ব্লক না করে)
কিন্তু ফলন অভিনয় করেন বিরতি এবং সারসংকলন আচরণে এটা করতে কিছু ফলাফল আসতে পাশাপাশি {value: any, done: boolean}
পূর্ববর্তী ফাংশন আমরা কোনো মান নির্গত নি অনুযায়ী। আমরা পূর্ববর্তী আউটপুট অন্বেষণ যদি একই দেখাবে { value: undefined, done: false }
মান undefined ।
ফলন কীওয়ার্ডটি সন্ধান করতে দেয়। Ptionচ্ছিকভাবে আপনি এক্সপ্রেশন যুক্ত করতে পারেন এবং একটি ডিফল্ট alচ্ছিক মান নির্ধারণ করতে পারেন । (অফিসিয়াল ডক সিনট্যাক্স)
[rv] = yield [expression];
অভিব্যক্তি : জেনারেটর ফাংশন থেকে ফিরে আসার মান
yield any;
yield {age: 12};
আরভি : জেনারেটরের পরবর্তী () পদ্ধতিতে পাস হওয়া .চ্ছিক মানটি প্রদান করে
কেবলমাত্র আপনি বিভিন্ন পদ্ধতির অংশ নির্বাহ করতে এই প্রক্রিয়াটির সাথে প্রক্রিয়া () ফাংশন করতে প্যারামিটারগুলি পাস করতে পারেন।
let val = yield 99;
_process.next(10);
now the val will be 10
রীতিনীতি
তথ্যসূত্র:
নিক সোটিরিসের উত্তরের সরলকরণ / বিশদ বিবরণ (যা আমি মনে করি দুর্দান্ত) আপনি কীভাবে কোডিং শুরু করবেন তা বর্ণনা করা ভাল বলে মনে করি yield
।
আমার মতে, ব্যবহারের সবচেয়ে বড় সুবিধা yield
হ'ল এটি কোডে আমরা যে সমস্ত নেস্টেড কলব্যাক সমস্যা দেখি তা দূর করবে। এটি প্রথমে কীভাবে দেখতে পারা শক্ত, তাই কেন আমি এই উত্তরটি লেখার সিদ্ধান্ত নিয়েছি (নিজের জন্য, এবং আশা করি অন্যরা!)
এটি যেভাবে কাজ করে তা হ'ল সহ-রুটিনের ধারণা প্রবর্তন করা, এটি এমন একটি ফাংশন যা স্বেচ্ছায় থামাতে / বিরতি দিতে পারে যতক্ষণ না এটি তার প্রয়োজনীয়তা পায়। জাভাস্ক্রিপ্টে এটি দ্বারা চিহ্নিত করা হয়েছে function*
। শুধুমাত্র function*
ফাংশনগুলি ব্যবহার করতে পারে yield
।
এখানে কিছু সাধারণ জাভাস্ক্রিপ্ট রয়েছে:
loadFromDB('query', function (err, result) {
// Do something with the result or handle the error
})
এটি আঁতাতাময় কারণ এখন আপনার সমস্ত কোড (যা স্পষ্টতই এই loadFromDB
কলটির জন্য অপেক্ষা করা দরকার) এই কুরুচিপূর্ণ কলব্যাকের অভ্যন্তরে থাকা দরকার। এটি কয়েকটি কারণে খারাপ ...
})
যা আপনাকে সর্বত্র ট্র্যাক করে রাখতে হবেfunction (err, result)
জর্জনresult
অন্যদিকে, সহ yield
, এই সমস্ত কিছুই চমৎকার সহ-রুটিন কাঠামোর সাহায্যে এক লাইনে করা যেতে পারে ।
function* main() {
var result = yield loadFromDB('query')
}
এবং সুতরাং এখন যখন আপনার ভেরিয়েবল এবং জিনিসগুলি লোড করার জন্য অপেক্ষা করা দরকার তখন আপনার মূল ফাংশনটি উপস্থিত হবে। তবে এখন এটি চালানোর জন্য আপনাকে একটি সাধারণ (নন-কর্টিন ফাংশন) কল করতে হবে । একটি সাধারণ সহ-রুটিন কাঠামো এই সমস্যাটিকে ঠিক করতে পারে যাতে আপনার যা করতে হবে তা এটি চালিত হয়:
start(main())
এবং শুরুটি সংজ্ঞায়িত করা হয়েছে (নিক সোটিরোর উত্তর থেকে)
function start(routine, data) {
result = routine.next(data);
if(!result.done) {
result.value(function(err, data) {
if(err) routine.throw(err); // continue next iteration of routine with an exception
else start(routine, data); // continue next iteration of routine normally
});
}
}
এবং এখন, আপনার কাছে এমন সুন্দর কোড থাকতে পারে যা অনেক বেশি পঠনযোগ্য, মুছতে সহজ, এবং ইনডেন্টস, ফাংশন ইত্যাদির সাথে গলদল করার প্রয়োজন নেই
একটি আকর্ষণীয় পর্যবেক্ষণ হ'ল এই উদাহরণে, yield
কেবলমাত্র একটি কীওয়ার্ড যা আপনি কলব্যাক দিয়ে কোনও ফাংশনের আগে রাখতে পারেন।
function* main() {
console.log(yield function(cb) { cb(null, "Hello World") })
}
"হ্যালো ওয়ার্ল্ড" মুদ্রণ করবে। সুতরাং আপনি yield
কেবল একই ফাংশন স্বাক্ষর (সিবি ছাড়াই) তৈরি করে এবং ফিরে আসার মাধ্যমে যেকোন কলব্যাক ফাংশনটিকে বাস্তবে রূপান্তর করতে পারেন function (cb) {}
:
function yieldAsyncFunc(arg1, arg2) {
return function (cb) {
realAsyncFunc(arg1, arg2, cb)
}
}
আশা করি এই জ্ঞানের সাহায্যে আপনি ক্লিনার, আরও পাঠযোগ্য কোড যা মুছে ফেলা যায় সহজেই লিখতে পারেন !
function*
ফলন ছাড়া একটি নিয়মিত ফাংশন?
function *
হ'ল এমন একটি ফাংশন যা ফলন ধারণ করে । এটি জেনারেটর নামে একটি বিশেষ ফাংশন।
yield
সর্বত্র ব্যবহার করে তাদের জন্য , আমি নিশ্চিত যে এটি কলব্যাকগুলির চেয়ে আরও বেশি অর্থবোধ করে, তবে আমি কীভাবে কলব্যাকের চেয়ে আরও বেশি পঠনযোগ্য তা দেখতে ব্যর্থ।
একটি সম্পূর্ণ উত্তর দিতে: yield
অনুরূপ কাজ করছেreturn
, কিন্তু একটি জেনারেটরে।
সাধারণত প্রদত্ত উদাহরণ হিসাবে, এটি নিম্নলিখিত হিসাবে কাজ করে:
function *squareGen(x) {
var i;
for (i = 0; i < x; i++) {
yield i*i;
}
}
var gen = squareGen(3);
console.log(gen.next().value); // prints 0
console.log(gen.next().value); // prints 1
console.log(gen.next().value); // prints 4
তবে ফলন কীওয়ার্ডের দ্বিতীয় উদ্দেশ্যও রয়েছে। এটি জেনারেটরের মান প্রেরণে ব্যবহার করা যেতে পারে।
স্পষ্ট করার জন্য, একটি ছোট উদাহরণ:
function *sendStuff() {
y = yield (0);
yield y*y;
}
var gen = sendStuff();
console.log(gen.next().value); // prints 0
console.log(gen.next(2).value); // prints 4
এটি প্রথম উত্পাদনে (যা ফিরে এসেছে ) বন্ধ হওয়ার পরে জেনারেটরে প্রেরণ করে, মূল্য 2
নির্ধারিত হিসাবে এটি কাজ করে ।y
0
এটি আমাদের কিছু সত্যই মজার স্টাফগুলিতে সক্ষম করে। (কর্টিন দেখুন)
এটি পুনরুক্তি-জেনারেটরের জন্য ব্যবহৃত হয়। মূলত, এটি আপনাকে পদ্ধতিগত কোড ব্যবহার করে একটি (সম্ভাব্য অসীম) অনুক্রম তৈরি করার অনুমতি দেয় allows দেখুন মজিলার ডকুমেন্টেশন ।
yield
একটি কর্টিন ফ্রেমওয়ার্ক সহ কলব্যাক হেল্প দূর করতেও ব্যবহার করা যেতে পারে।
function start(routine, data) {
result = routine.next(data);
if(!result.done) {
result.value(function(err, data) {
if(err) routine.throw(err); // continue next iteration of routine with an exception
else start(routine, data); // continue next iteration of routine normally
});
}
}
// with nodejs as 'node --harmony'
fs = require('fs');
function read(path) {
return function(callback) { fs.readFile(path, {encoding:'utf8'}, callback); };
}
function* routine() {
text = yield read('/path/to/some/file.txt');
console.log(text);
}
// with mdn javascript 1.7
http.get = function(url) {
return function(callback) {
// make xhr request object,
// use callback(null, resonseText) on status 200,
// or callback(responseText) on status 500
};
};
function* routine() {
text = yield http.get('/path/to/some/file.txt');
console.log(text);
}
// invoked as.., on both mdn and nodejs
start(routine());
ফলন কীওয়ার্ড ব্যবহার করে ফিবোনাচি সিকোয়েন্স জেনারেটর।
function* fibbonaci(){
var a = -1, b = 1, c;
while(1){
c = a + b;
a = b;
b = c;
yield c;
}
}
var fibonacciGenerator = fibbonaci();
fibonacciGenerator.next().value; // 0
fibonacciGenerator.next().value; // 1
fibonacciGenerator.next().value; // 1
fibonacciGenerator.next().value; // 2
Yeild
জাভাস্ক্রিপ্ট ফাংশনে কীওয়ার্ড এটিকে জেনারেটর করে তোলে,
জাভা স্ক্রিপ্ট জেনারেটর কি?
একটি জেনারেটর এমন একটি ফাংশন যা একক মানের পরিবর্তে ফলাফলের ক্রম উত্পাদন করে, অর্থাত আপনি একটি মানের মান নির্ধারণ করেন
অর্থ জেনারেটরগুলি সাহায্য পুনরুক্তিকারীদের সাথে আমাদের অবিচ্ছিন্নভাবে কাজ করতে সহায়তা করে, ওহে এখন হ্যাক পুনরাবৃত্তিগুলি কী? সত্যি?
আইট্রেটর বলতে বোঝায় যার মাধ্যমে আমরা একবারে আইটেমগুলিতে অ্যাক্সেস করতে সক্ষম
কোথা থেকে পুনরাবৃত্তিকারীরা আমাদের একবারে আইটেমটি অ্যাক্সেস করতে সহায়তা করে? এটি জেনারেটর ফাংশনগুলির মাধ্যমে আইটেমগুলিতে অ্যাক্সেস করতে আমাদের সহায়তা করে,
জেনারেটর ফাংশনগুলি হ'ল সেগুলিতে আমরা yeild
কীওয়ার্ড ব্যবহার করি , ফলন কীওয়ার্ডটি ফাংশনটির কার্যকারিতা থামিয়ে দেওয়া ও পুনরায় শুরু করতে সহায়তা করে
এখানে দ্রুত উদাহরণ
function *getMeDrink() {
let question1 = yield 'soda or beer' // execution will pause here because of yield
if (question1 == 'soda') {
return 'here you get your soda'
}
if (question1 == 'beer') {
let question2 = yield 'Whats your age' // execution will pause here because of yield
if (question2 > 18) {
return "ok you are eligible for it"
} else {
return 'Shhhh!!!!'
}
}
}
let _getMeDrink = getMeDrink() // initialize it
_getMeDrink.next().value // "soda or beer"
_getMeDrink.next('beer').value // "Whats your age"
_getMeDrink.next('20').value // "ok you are eligible for it"
_getMeDrink.next().value // undefined
আমাকে কি চলছে তা স্পষ্টভাবে ব্যাখ্যা করতে দিন
আপনি লক্ষ্য করেছেন প্রতিটি yeild
কীওয়ার্ডে মৃত্যুদন্ড কার্যকর করা বন্ধ হয়ে গেছে এবং আমরা yield
পুনরাবৃত্তির সাহায্যে প্রথমে অ্যাক্সেস করতে সক্ষম হয়েছি.next()
এটি yield
একবারে সমস্ত কীওয়ার্ডে পুনরাবৃত্তি করে এবং তারপরে অনির্ধারিত অবস্থায় ফিরে আসে যখন yield
আপনি বলতে পারেন এমন সহজ শব্দে আর কীওয়ার্ড নেই leftyield
ব্রেক পয়েন্ট যেখানে প্রতিটি সময় বিরতি দেয় এবং কেবল পুনরায় শুরু করতে হবে যখন পুনরাবৃত্তিকারী ব্যবহার করে কল করুন
আমাদের ক্ষেত্রে: _getMeDrink.next()
এটি পুনরুক্তির উদাহরণ যা ফাংশনে প্রতিটি ব্রেক পয়েন্ট অ্যাক্সেস করতে আমাদের সহায়তা করে
জেনারেটরের উদাহরণ:
async/await
যদি আপনি দেখেন বাস্তবায়ন async/await
দেখতে হবে generator functions & promises
করতে ব্যবহার করা হয় async/await
কাজ
কোন পরামর্শ স্বাগত জানানো হয় চিহ্নিত করুন
অ্যাসিঙ্ক জাভাস্ক্রিপ্ট কলগুলির মধ্যে নির্ভরতা।
ফলন কীভাবে ব্যবহার করা যায় তার আরও একটি ভাল উদাহরণ।
function request(url) {
axios.get(url).then((reponse) => {
it.next(response);
})
}
function* main() {
const result1 = yield request('http://some.api.com' );
const result2 = yield request('http://some.otherapi?id=' + result1.id );
console.log('Your response is: ' + result2.value);
}
var it = main();
it.next()
ফলন সম্পর্কে জানার আগে জেনারেটর সম্পর্কে আপনার জানা দরকার। জেনারেটরগুলি function*
সিনট্যাক্স ব্যবহার করে তৈরি করা হয় । জেনারেটর ফাংশন কোড চালায় না তবে পরিবর্তে এক ধরণের পুনরায় জেনারেটর বলে returns next
পদ্ধতিটি ব্যবহার করে যখন কোনও মান দেওয়া হয় , ফলন কীওয়ার্ডটি না আসা পর্যন্ত জেনারেটর ফাংশন কার্যকর করে চলে। ব্যবহার yield
আপনাকে দুটি মান সমেত একটি বস্তু ফিরিয়ে দেয়, একটির মান এবং অন্যটি সম্পন্ন হয় (বুলিয়ান)। মানটি একটি অ্যারে, অবজেক্ট ইত্যাদি হতে পারে
একটি সাধারণ উদাহরণ:
const strArr = ["red", "green", "blue", "black"];
const strGen = function*() {
for(let str of strArr) {
yield str;
}
};
let gen = strGen();
for (let i = 0; i < 5; i++) {
console.log(gen.next())
}
//prints: {value: "red", done: false} -> 5 times with different colors, if you try it again as below:
console.log(gen.next());
//prints: {value: undefined, done: true}
আমিও ফলন কীওয়ার্ডটি বোঝার চেষ্টা করছি। আমার বর্তমান বোঝাপড়ার উপর ভিত্তি করে, জেনারেটরে, ফলন কীওয়ার্ড সিপিইউ কনটেক্সট-সুইচের মতো কাজ করে। যখন ফলন বিবৃতি চালানো হয়, সমস্ত রাজ্য (উদাহরণস্বরূপ, স্থানীয় ভেরিয়েবল) সংরক্ষণ করা হয়।
এটির পাশাপাশি, সরাসরি ফলাফল অবজেক্টটি কলারের কাছে ফিরে আসবে, যেমন {মান: 0, সম্পন্ন: মিথ্যা}} কলার এই রেজাল্ট অবজেক্টটি ব্যবহার করে জেনারেটরটিকে পুনরায় '(জাগ্রত' করতে হবে) পরবর্তী () কল করে (পরের দিকে () কলটি প্রয়োগের পুনরাবৃত্তি করতে হবে) তা প্রয়োগ করতে পারেন।
আর একটি গুরুত্বপূর্ণ বিষয় হ'ল এটি স্থানীয় ভেরিয়েবলের মান নির্ধারণ করতে পারে। এই মানটি জেনারেটরটি 'জাগ্রত করার সময়' পরবর্তী () 'কলার দ্বারা পাস করা যেতে পারে। উদাহরণস্বরূপ, এটি.নেক্সট ('valueToPass'), এর মতো: "রেজাল্ট ভ্যালু = ফলন স্লো কুইচারি (1);" ঠিক পরের এক্সিকিউশনটি জাগ্রত করার সময়, কলার মৃত্যুদন্ড কার্যকর করার জন্য কিছু চলমান ফলাফল ইনজেক্ট করতে পারে (এটি স্থানীয় ভেরিয়েবলে ইনজেকশন দিয়ে)। সুতরাং, এই মৃত্যুদন্ড কার্যকর করার জন্য, দুই ধরণের রাষ্ট্র রয়েছে:
প্রসঙ্গটি যা শেষ সম্পাদনায় সংরক্ষিত হয়েছিল।
এই নির্বাহের ট্রিগার দ্বারা ইনজেকশনের মানগুলি।
সুতরাং, এই বৈশিষ্ট্যটির সাহায্যে, জেনারেটর একাধিক অ্যাসিঙ্ক অপারেশনগুলি বাছাই করতে পারে। স্থানীয় ভেরিয়েবল (উপরের উদাহরণে রেজাল্ট ভ্যালু) সেট করে প্রথম অ্যাসিঙ্ক ক্যোয়ারির ফলাফল দ্বিতীয়টিতে পৌঁছে দেওয়া হবে। দ্বিতীয় অ্যাসিঙ্ক ক্যোয়ারী কেবল প্রথম অ্যাসিঙ্ক ক্যোয়ারির প্রতিক্রিয়া দ্বারা ট্রিগার করা যায়। তারপরে দ্বিতীয় অ্যাসিঙ্ক ক্যোয়ারী পরবর্তী পদক্ষেপগুলি সিদ্ধান্ত নেওয়ার জন্য স্থানীয় ভেরিয়েবল মানটি পরীক্ষা করতে পারে কারণ স্থানীয় ভেরিয়েবলটি প্রথম ক্যোয়ারীর প্রতিক্রিয়া থেকে একটি ইনজেকশনের মান।
অ্যাসিঙ্ক প্রশ্নগুলির অসুবিধাগুলি হ'ল:
কলব্যাক নরক
কলব্যাকের প্যারামিটার হিসাবে পাস না করে প্রসঙ্গে হারাবেন।
ফলন এবং জেনারেটর উভয়কেই সহায়তা করতে পারে।
ফলন ও জেনারেটর ব্যতীত, একাধিক অ্যাসিঙ্ক ক্যোয়ারিকে বাছাই করার জন্য পরামিতিগুলির সাথে নেস্টেড কলব্যাক প্রসঙ্গ হিসাবে প্রয়োজন যা পড়া এবং বজায় রাখা সহজ নয়।
নীচে একটি শৃঙ্খলিত async ক্যোয়ারী উদাহরণ যা নোডেজের সাথে চলছে:
const axios = require('axios');
function slowQuery(url) {
axios.get(url)
.then(function (response) {
it.next(1);
})
.catch(function (error) {
it.next(0);
})
}
function* myGen(i=0) {
let queryResult = 0;
console.log("query1", queryResult);
queryResult = yield slowQuery('https://google.com');
if(queryResult == 1) {
console.log("query2", queryResult);
//change it to the correct url and run again.
queryResult = yield slowQuery('https://1111111111google.com');
}
if(queryResult == 1) {
console.log("query3", queryResult);
queryResult = yield slowQuery('https://google.com');
} else {
console.log("query4", queryResult);
queryResult = yield slowQuery('https://google.com');
}
}
console.log("+++++++++++start+++++++++++");
let it = myGen();
let result = it.next();
console.log("+++++++++++end+++++++++++");
নীচে চলমান ফলাফল:
শুরু +++++++++++ +++++++++++
জিজ্ঞাসা 1 0
+++++++++++ শেষ +++++++++++
ক্যোয়ারি 2 1
জিজ্ঞাসা 4 0
উপরের উদাহরণের জন্য রাষ্ট্রের নিদর্শন নীচে একই জিনিস করতে পারে:
const axios = require('axios');
function slowQuery(url) {
axios.get(url)
.then(function (response) {
sm.next(1);
})
.catch(function (error) {
sm.next(0);
})
}
class StateMachine {
constructor () {
this.handler = handlerA;
this.next = (result = 1) => this.handler(this, result);
}
}
const handlerA = (sm, result) => {
const queryResult = result; //similar with generator injection
console.log("query1", queryResult);
slowQuery('https://google.com');
sm.handler = handlerB; //similar with yield;
};
const handlerB = (sm, result) => {
const queryResult = result; //similar with generator injection
if(queryResult == 1) {
console.log("query2", queryResult);
slowQuery('https://1111111111google.com');
}
sm.handler = handlerC; //similar with yield;
};
const handlerC = (sm, result) => {
const queryResult = result; //similar with generator injection;
if (result == 1 ) {
console.log("query3", queryResult);
slowQuery('https://google.com');
} else {
console.log("query4", queryResult);
slowQuery('https://google.com');
}
sm.handler = handlerEnd; //similar with yield;
};
const handlerEnd = (sm, result) => {};
console.log("+++++++++++start+++++++++++");
const sm = new StateMachine();
sm.next();
console.log("+++++++++++end+++++++++++");
নিম্নলিখিত চলমান ফলাফল:
শুরু +++++++++++ +++++++++++
জিজ্ঞাসা 1 0
+++++++++++ শেষ +++++++++++
ক্যোয়ারি 2 1
জিজ্ঞাসা 4 0
জেনারেটরের মাধ্যমে লুপ করতে খুব সহায়ক 'জেনারেটরের x' সিনট্যাক্সটি ভুলে যাবেন না। পরের () ফাংশনটি ব্যবহার করার দরকার নেই।
function* square(x){
for(i=0;i<100;i++){
x = x * 2;
yield x;
}
}
var gen = square(2);
for(x of gen){
console.log(x);
}