একটি .ঠেন () চেইনে পূর্ববর্তী প্রতিশ্রুতি ফলাফলগুলিতে আমি কীভাবে অ্যাক্সেস করব?


650

আমি আমার কোড প্রতিশ্রুতি পুনর্গঠন করেছি এবং একাধিক কলব্যাক সমন্বয়ে একটি দুর্দান্ত দীর্ঘ ফ্ল্যাট প্রতিশ্রুতি তৈরি করেছি .then()। শেষ পর্যন্ত আমি কিছু সংমিশ্রিত মান ফিরিয়ে দিতে চাই এবং একাধিক মধ্যবর্তী প্রতিশ্রুতি ফলাফল অ্যাক্সেস করতে হবে । তবে ক্রমের মাঝামাঝি থেকে রেজ্যুলেশন মানগুলি শেষ কলব্যাকের সুযোগে নেই, আমি কীভাবে এগুলি অ্যাক্সেস করব?

function getExample() {
    return promiseA(…).then(function(resultA) {
        // Some processing
        return promiseB(…);
    }).then(function(resultB) {
        // More processing
        return // How do I gain access to resultA here?
    });
}

2
এই প্রশ্নটি সত্যিই আকর্ষণীয় এবং এটি ট্যাগ করা হলেও এটি javascriptঅন্যান্য ভাষায় প্রাসঙ্গিক। আমি কেবল জাভা এবং জেডিফার্ডে "ব্রেক চেইন" উত্তরটি ব্যবহার করি
gontard

উত্তর:


377

শিকলটা ভাঙ্গো

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

এটি খুব সোজা কন্ট্রোল প্রবাহ, কার্যকারিতার সুস্পষ্ট সংমিশ্রণ এবং অতএব সহজ মডুলারাইজেশনের ফলস্বরূপ।

function getExample() {
    var a = promiseA(…);
    var b = a.then(function(resultA) {
        // some processing
        return promiseB(…);
    });
    return Promise.all([a, b]).then(function([resultA, resultB]) {
        // more processing
        return // something using both resultA and resultB
    });
}

কলব্যাক মাপদণ্ড ডেসট্রাকচারিং পর পরিবর্তে Promise.allযে শুধুমাত্র ES6 সাথে উপলব্ধ হয়ে ওঠে, ES5 মধ্যে thenকল নিফটি সাহায্যকারী পদ্ধতি যে অনেক প্রতিশ্রুতি লাইব্রেরি দ্বারা সরবরাহ করা হয়েছিল দ্বারা প্রতিস্থাপন করা হবে ( প্রশ্ন , Bluebird , যখন , ...): .spread(function(resultA, resultB) { …

একটি সহজ (এবং আরও দক্ষ) নির্মাণের সাথে + মিশ্রণটি প্রতিস্থাপনের জন্য ব্লুবার্ড একটি উত্সর্গীকৃত joinফাংশনও দেখায় :Promise.allspread


return Promise.join(a, b, function(resultA, resultB) {  });

1
অ্যারের ভিতরে ফাংশনগুলি ক্রমে কার্যকর করা হয়?
scaryguy

6
@ এসক্রিগুয়ে: অ্যারেতে কোনও ফাংশন নেই, সেগুলি প্রতিশ্রুতি। promiseAএবং promiseBএখানে (প্রতিশ্রুতি ফেরত) ফাংশন হয়।
বার্গি

2
@ রোল্যান্ড কখনই বলেন নি যে এটি ছিল :-) এই উত্তরটি ES5 যুগে লেখা হয়েছিল যেখানে কোনও প্রতিশ্রুতি আদৌ মান ছিল না এবং spreadএই প্যাটার্নে এটি অত্যন্ত কার্যকর ছিল। আরও আধুনিক সমাধানের জন্য গৃহীত উত্তরটি দেখুন। যাইহোক, আমি ইতিমধ্যে পরিষ্কার-পাশের উত্তরটি আপডেট করেছি , এবং এটিও আপডেট না করার কোনও সত্য কারণ নেই।
বার্গি

1
@ পুনঃনির্ধারণ করুন না, আপনার এটি করা উচিত নয় , এটি অস্বীকার নিয়ে ঝামেলা এনে দেবে।
বার্গি

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

238

ইসমাস্ক্রিপ্ট হারমনি

অবশ্যই, এই সমস্যাটি ভাষা ডিজাইনারদের দ্বারাও স্বীকৃত হয়েছিল। তারা প্রচুর কাজ করেছে এবং অ্যাসিঙ্ক ফাংশনগুলির প্রস্তাবটি শেষ পর্যন্ত এটি তৈরি করে

ECMAScript 8

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

async function getExample() {
    var resultA = await promiseA(…);
    // some processing
    var resultB = await promiseB(…);
    // more processing
    return // something using both resultA and resultB
}

ইসমাস্ক্রিপ্ট।

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

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

var getExample = Promise.coroutine(function* () {
//               ^^^^^^^^^^^^^^^^^ Bluebird syntax
    var resultA = yield promiseA(…);
    // some processing
    var resultB = yield promiseB(…);
    // more processing
    return // something using both resultA and resultB
});

এটি নোড.জেএস-এ সংস্করণ 4.0 থেকে কাজ করেছে, কয়েকটি ব্রাউজার (বা তাদের ডেভ সংস্করণগুলি) তুলনামূলকভাবে প্রাথমিকভাবে জেনারেটর সিনট্যাক্স সমর্থন করেছিল।

ECMAScript 5

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

এবং তারপরে, আরও অনেকগুলি সংকলিত-জেএস ভাষা রয়েছে যা অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং সহজ করার জন্য উত্সর্গীকৃত। তারা সাধারণত একটি বাক্য গঠন অনুরূপ ব্যবহার await, (যেমন বরফ CoffeeScript ), কিন্তু সেখানে অন্যদের যে একটি Haskell, মত বৈশিষ্ট্য আছে do-notation (যেমন LatteJs , কীটাণুজাতীয় , PureScript বা LispyScript )।


@ বেরগি আপনার কি বাহ্যিক কোড থেকে অ্যাসিঙ্ক ফাংশন পরীক্ষার getExample () অপেক্ষা করতে হবে?
এরিসালেক্সিস

@ আরিসালেক্সিস: হ্যাঁ, getExampleএখনও এমন একটি ফাংশন যা প্রতিশ্রুতি দেয়, অন্য উত্তরের ফাংশনের মতোই কাজ করে, তবে সুন্দর সিনট্যাক্স সহ। আপনি awaitঅন্য কোনও asyncঅনুষ্ঠানে কল করতে পারেন, বা আপনি .then()তার ফলাফলটিতে চেইন করতে পারেন ।
বার্গি 21

1
আমি কৌতূহলী, কেন আপনি নিজের প্রশ্ন জিজ্ঞাসা করার সাথে সাথে তার উত্তর দিয়েছেন? এখানে কিছু ভাল আলোচনা আছে, তবে আমি কৌতূহলী। জিজ্ঞাসা করার পরে আপনি নিজের উত্তর নিজেরাই খুঁজে পেয়েছেন?
গ্রানময়ে

@ গ্রানমোয়ে: আমি পুরো আলোচনাটিকে উদ্দেশ্যমূলক নকল লক্ষ্য হিসাবে উদ্দেশ্য হিসাবে পোস্ট করেছি
বার্গি

জেনারেটর ফাংশন সহ ECMAScript 6 উদাহরণে Promise.coroutine (অর্থাত্ ব্লুবার্ড বা অন্য লাইব্রেরি ব্যবহার না করে কেবল প্লেইন জেএস) ব্যবহার এড়াতে কি (খুব শ্রমসাধ্য নয়) উপায় আছে? আমি মনে মনে কিছু ছিল steps.next().value.then(steps.next)...কিন্তু এটি কাজ করে না।
একটি শিক্ষানবিশ এর 13 ই

102

সিঙ্ক্রোনাস ইন্সপেকশন

পরিবর্তনগুলি-পরে-প্রয়োজনীয়-মানগুলি প্রতিশ্রুতি প্রদান এবং তারপরে সিঙ্ক্রোনাস পরিদর্শনের মাধ্যমে তাদের মান প্রাপ্তি। উদাহরণটি ব্লুবার্ডের .value()পদ্ধতি ব্যবহার করে তবে অনেক লাইব্রেরি একই ধরণের পদ্ধতি সরবরাহ করে।

function getExample() {
    var a = promiseA(…);

    return a.then(function() {
        // some processing
        return promiseB(…);
    }).then(function(resultB) {
        // a is guaranteed to be fulfilled here so we can just retrieve its
        // value synchronously
        var aValue = a.value();
    });
}

এটি আপনার পছন্দ মতো মান হিসাবে ব্যবহার করা যেতে পারে:

function getExample() {
    var a = promiseA(…);

    var b = a.then(function() {
        return promiseB(…)
    });

    var c = b.then(function() {
        return promiseC(…);
    });

    var d = c.then(function() {
        return promiseD(…);
    });

    return d.then(function() {
        return a.value() + b.value() + c.value() + d.value();
    });
}

6
এটি আমার প্রিয় উত্তর: পাঠযোগ্য, এক্সটেনসিবল এবং গ্রন্থাগার বা ভাষার বৈশিষ্ট্যগুলির উপর নূন্যতম নির্ভরতা
জেসন

13
@ জেসন: উহ, " গ্রন্থাগারের বৈশিষ্ট্যগুলির উপর ন্যূনতম নির্ভরতা "? সিঙ্ক্রোনাস ইন্সপেকশন হ'ল একটি লাইব্রেরি বৈশিষ্ট্য এবং বুট করার জন্য যথেষ্ট মানহীন।
বার্গি

2
আমি মনে করি তিনি লাইব্রেরির নির্দিষ্ট বৈশিষ্ট্যগুলি বোঝাতে চেয়েছিলেন
ডেথগ্যাজে

54

বাসা বাঁধতে (এবং) বন্ধ

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

function getExample() {
    return promiseA(…).then(function(resultA) {
        // some processing
        return promiseB(…).then(function(resultB) {
            // more processing
            return // something using both resultA and resultB;
        });
    });
}

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

function getExample() {
    // preprocessing
    return promiseA(…).then(makeAhandler(…));
}
function makeAhandler(…)
    return function(resultA) {
        // some processing
        return promiseB(…).then(makeBhandler(resultA, …));
    };
}
function makeBhandler(resultA, …) {
    return function(resultB) {
        // more processing
        return // anything that uses the variables in scope
    };
}

এছাড়াও আপনি এই ধরনের সাহায্যকারী ফাংশন ব্যবহার করতে পারেন আংশিক আবেদন মত, _.partialথেকে আন্ডারস্কোর / lodash বা নেটিভ .bind()পদ্ধতি , আরও হ্রাস খাঁজ হবে:

function getExample() {
    // preprocessing
    return promiseA(…).then(handlerA);
}
function handlerA(resultA) {
    // some processing
    return promiseB(…).then(handlerB.bind(null, resultA));
}
function handlerB(resultA, resultB) {
    // more processing
    return // anything that uses resultA and resultB
}

5
Pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html সম্পর্কিত নোলান লসনের নিবন্ধে 'উন্নত ভুল # 4' এর সমাধান হিসাবে এই একই পরামর্শ দেওয়া হয়েছে । এটি একটি ভাল পড়া।
রবার্ট

2
এটি ঠিক bindমোনাদসে ফাংশন। হাস্কেল এটিকে সংশ্লেষের মতো দেখতে / সিনট্যাক্সের জন্য অপেক্ষা করতে সিনট্যাকটিক চিনি সরবরাহ করে not
জেরোনোন

50

সুস্পষ্ট পাস-মাধ্যমে

কলব্যাকগুলিকে বাসা বাঁধার অনুরূপ, এই কৌশলটি ক্লোজারগুলিতে নির্ভর করে। তবুও, চেইনটি সমতল থাকে - কেবল সর্বশেষ ফলাফলটি পাস করার পরিবর্তে প্রতিটি পদক্ষেপের জন্য কিছু স্টেট অবজেক্ট পাস হয়। এই রাষ্ট্রীয় অবজেক্টগুলি পূর্ববর্তী ক্রিয়াকলাপগুলির ফলাফলগুলি সঞ্চিত করে, সমস্ত মানগুলিকে হস্তান্তর করে যা পরে প্রয়োজন হবে এবং বর্তমান কার্যের ফলাফল।

function getExample() {
    return promiseA(…).then(function(resultA) {
        // some processing
        return promiseB(…).then(b => [resultA, b]); // function(b) { return [resultA, b] }
    }).then(function([resultA, resultB]) {
        // more processing
        return // something using both resultA and resultB
    });
}

এখানে, এই ছোট তীর b => [resultA, b] হ'ল ফাংশন যা বন্ধ হয়ে resultAযায় এবং উভয় ফলাফলের অ্যারেটি পরবর্তী ধাপে পাস করে। এটি আবার একক ভেরিয়েবলগুলিতে ব্রেক আপ করতে প্যারামিটার ডেস্ট্রাকচারিং সিনট্যাক্স ব্যবহার করে।

ES6 এর সাথে ডেস্ট্রাকচারিং উপলব্ধ হওয়ার আগে, একটি নিমফ হেল্পার পদ্ধতিটি .spread()অনেক প্রতিশ্রুতি পাঠাগারগুলি সরবরাহ করেছিল ( কিউ , ব্লুবার্ড , কখন , ...)। এটি একাধিক পরামিতি সহ একটি ফাংশন নেয় - প্রতিটি অ্যারে উপাদানগুলির জন্য একটি - হিসাবে ব্যবহৃত হয় .spread(function(resultA, resultB) { …

অবশ্যই, এখানে যে ক্লোজারটির প্রয়োজন রয়েছে সেটি আরও কিছু সহায়ক ফাংশন দ্বারা সরল করা যেতে পারে, যেমন

function addTo(x) {
    // imagine complex `arguments` fiddling or anything that helps usability
    // but you get the idea with this simple one:
    return res => [x, res];
}


return promiseB(…).then(addTo(resultA));

বিকল্পভাবে, আপনি Promise.allঅ্যারের প্রতিশ্রুতি উত্পাদন করতে নিয়োগ করতে পারেন :

function getExample() {
    return promiseA(…).then(function(resultA) {
        // some processing
        return Promise.all([resultA, promiseB(…)]); // resultA will implicitly be wrapped
                                                    // as if passed to Promise.resolve()
    }).then(function([resultA, resultB]) {
        // more processing
        return // something using both resultA and resultB
    });
}

এবং আপনি কেবল অ্যারে ব্যবহার করতে পারেন না, কিন্তু নির্বিচারে জটিল বস্তু। উদাহরণস্বরূপ, সঙ্গে _.extendবাObject.assign একটি ভিন্ন সহায়ক ফাংশন এর :

function augment(obj, name) {
    return function (res) { var r = Object.assign({}, obj); r[name] = res; return r; };
}

function getExample() {
    return promiseA(…).then(function(resultA) {
        // some processing
        return promiseB(…).then(augment({resultA}, "resultB"));
    }).then(function(obj) {
        // more processing
        return // something using both obj.resultA and obj.resultB
    });
}

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


প্রথমত, আমি সিনট্যাক্স বাদ মনে করি না Promise.allউত্সাহিত করা উচিত (এটা হবে ES6 কাজ নাও যখন ডেসট্রাকচারিং এটি প্রতিস্থাপন করবে এবং সুইচিং একটি .spreadএকটি থেকে thenমানুষ প্রায়ই অপ্রত্যাশিত ফলাফল দেয় বৃদ্ধি হিসাবে -। আমি নিশ্চিত আপনি কেন প্রয়োজন নই ব্যবহারের বৃদ্ধির জন্য -। প্রতিশ্রুতি প্রোটোটাইপ জিনিস যোগ যাহাই হউক না কেন ES6 প্রতিশ্রুতি প্রসারিত করতে একটি গ্রহণযোগ্য উপায়ে (বর্তমানে অসমর্থিত) subclassing সঙ্গে বাড়ানো হতে অনুমিত হয় নয়
বেঞ্জামিন Gruenbaum

@ বেঞ্জামিন গ্রুয়েনবাউম: " সিনট্যাক্স বাদ দিয়েPromise.all " বলতে কী বোঝ ? এই উত্তরের কোনও পদ্ধতিই ES6 এর সাথে ভেঙে যাবে না। spreadকোনও ডেস্ট্রাকচারে স্যুইচ করার thenক্ষেত্রে সমস্যাগুলিও হওয়া উচিত নয়। পুনঃপ্রোটাইপ.অগমেন্ট: আমি জানতাম যে কেউ এটি লক্ষ্য করবে, আমি কেবল সম্ভাবনাগুলি ঘুরে দেখতে পছন্দ করেছি - এটি সম্পাদনা করতে যাচ্ছি।
বার্গি

অ্যারের সিনট্যাক্সের দ্বারা আমি এর return [x,y]; }).spread(...পরিবর্তে এর অর্থ return Promise.all([x, y]); }).spread(...হ'ল এস dest নষ্টকারী চিনির জন্য ছড়িয়ে দেওয়ার সময় পরিবর্তন হবে না এবং এমন কোনও অদ্ভুত প্রান্তের ঘটনাও হবে না যেখানে প্রতিশ্রুতিগুলি সমস্ত কিছুর চেয়ে আলাদাভাবে ফিরে আসার আচরণ করে।
বেনিয়ামিন গ্রুইনবাউম

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

1
@ ক্যাপিথেরিল উত্তরটি তখন লেখা হয়েছিল যখন ES6 আজকের মতো বিস্তৃত ছিল না। হ্যাঁ, সম্ভবত এটি উদাহরণগুলি অদল করার সময় হয়েছে
বার্গি

35

পরিবর্তনীয় প্রাসঙ্গিক অবস্থা

তুচ্ছ (তবে ত্রুটিযুক্ত এবং বরং ত্রুটিযুক্ত) সমাধানটি হ'ল উচ্চ-স্কোপ ভেরিয়েবলগুলি ব্যবহার করা (যার কাছে চেইনের সমস্ত কলব্যাক অ্যাক্সেস রয়েছে) এবং ফলাফলগুলি যখন সেগুলি প্রাপ্ত হয় সেগুলিতে লিখুন:

function getExample() {
    var resultA;
    return promiseA(…).then(function(_resultA) {
        resultA = _resultA;
        // some processing
        return promiseB(…);
    }).then(function(resultB) {
        // more processing
        return // something using both resultA and resultB
    });
}

অনেকগুলি ভেরিয়েবলের পরিবর্তে কেউ একটি (প্রাথমিকভাবে খালি) অবজেক্টটিও ব্যবহার করতে পারে, যার ভিত্তিতে ফলাফলগুলি গতিশীলভাবে তৈরি বৈশিষ্ট্য হিসাবে সংরক্ষণ করা হয়।

এই সমাধানটির বেশ কয়েকটি ত্রুটি রয়েছে:

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

ব্লুবার্ড লাইব্রেরি একটি প্রতিশ্রুতি শৃঙ্খলে প্রসঙ্গ অবজেক্ট বরাদ্দ করার জন্য তাদের bind()পদ্ধতিটি ব্যবহার করে একটি অবজেক্টের ব্যবহারকে উত্সাহ দেয় along এটি প্রতিটি কলব্যাক ফাংশন থেকে অন্যথায় অব্যবহারযোগ্য thisকীওয়ার্ডের মাধ্যমে অ্যাক্সেসযোগ্য হবে । বস্তুর বৈশিষ্ট্যগুলি ভেরিয়েবলের তুলনায় অনির্দিষ্ট টাইপগুলির প্রবণতা বেশি, তবে প্যাটার্নটি বেশ চালাক:

function getExample() {
    return promiseA(…)
    .bind({}) // Bluebird only!
    .then(function(resultA) {
        this.resultA = resultA;
        // some processing
        return promiseB(…);
    }).then(function(resultB) {
        // more processing
        return // something using both this.resultA and resultB
    }).bind(); // don't forget to unbind the object if you don't want the
               // caller to access it
}

এই পদ্ধতির সহজেই প্রতিশ্রুতিবদ্ধ গ্রন্থাগারগুলিতে সিমুলেশন করা যেতে পারে যা .bind সমর্থন করে না (যদিও কিছুটা আরও ভার্বোজ পদ্ধতিতে এবং একটি অভিব্যক্তিতে ব্যবহার করা যায় না):

function getExample() {
    var ctx = {};
    return promiseA(…)
    .then(function(resultA) {
        this.resultA = resultA;
        // some processing
        return promiseB(…);
    }.bind(ctx)).then(function(resultB) {
        // more processing
        return // something using both this.resultA and resultB
    }.bind(ctx));
}

.bind()মেমরি ফাঁস রোধে অপ্রয়োজনীয়
ইসাইলিজা

@ ইসাইলিজা: তবে প্রত্যাবর্তিত প্রতিশ্রুতি অন্যথায় প্রসঙ্গ অবজেক্টের কোনও রেফারেন্স রাখে না? ঠিক আছে, অবশ্যই আবর্জনা সংগ্রহ এটি পরে পরিচালনা করবে; প্রতিশ্রুতি কখনও নিষ্পত্তি না হলে এটি "ফুটো" নয়।
বার্গি

হ্যাঁ, প্রতিশ্রুতিগুলিও তাদের সিদ্ধি মূল্য এবং ত্রুটির কারণে রেফারেন্স রাখে ... তবে প্রতিশ্রুতির কোনও কিছুই রেফারেন্স রাখে না তাই এটি
বিবেচ্য

4
আমি প্রায় উত্তর উপস্থাপনায় ভোট দেওয়ার কারণে দয়া করে এই উত্তরটি দুটি ভাগে বিভক্ত করুন! আমি মনে করি "তুচ্ছ (তবে অকার্যকর এবং বরং ত্রুটিযুক্ত সমাধান) সমাধান" সবচেয়ে পরিষ্কার এবং সহজ সমাধান, কারণ এটি আপনার গৃহীত স্ব-উত্তরের চেয়ে ক্লোজার এবং পরিবর্তনীয় অবস্থার উপর আর নির্ভর করে না, তবুও সহজ। বন্ধগুলি বিশ্বব্যাপী বা মন্দ নয়। এই পদ্ধতির বিরুদ্ধে দেওয়া যুক্তিগুলি আমার পক্ষে কোনও ধারণা দেয় না এই ভিত্তিটি দেওয়া হয়েছে। কোন "মডেলাইজেশন সমস্যাগুলি" একটি দুর্দান্ত দীর্ঘ ফ্ল্যাট প্রতিশ্রুতি "দেওয়া যেতে পারে?
jib

2
আমি উপরে যেমন বলেছি, প্রতিশ্রুতিগুলি হ'ল "ফাংশনাল রিঅ্যাকটিভ প্রোগ্রামিং" -লাইট। এটি এফআরপি-র একটি বিরোধী-প্যাটার্ন
ইউ আভালোস

15

"পরিবর্তনীয় প্রাসঙ্গিক রাষ্ট্র" এর উপর কম কঠোর স্পিন

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

function getExample(){
    //locally scoped
    const results = {};
    return promiseA(paramsA).then(function(resultA){
        results.a = resultA;
        return promiseB(paramsB);
    }).then(function(resultB){
        results.b = resultB;
        return promiseC(paramsC);
    }).then(function(resultC){
        //Resolve with composite of all promises
        return Promise.resolve(results.a + results.b + resultC);
    }).catch(function(error){
        return Promise.reject(error);
    });
}
  • গ্লোবাল ভেরিয়েবলগুলি খারাপ, সুতরাং এই সমাধানটি স্থানীয়ভাবে স্কোপযুক্ত ভেরিয়েবল ব্যবহার করে যা কোনও ক্ষতি করে না। এটি কেবল ফাংশনের মধ্যেই অ্যাক্সেসযোগ্য।
  • পরিবর্তনীয় অবস্থা কুৎসিত, তবে এটি একটি কুশ্রী পদ্ধতিতে রাজ্যকে পরিবর্তিত করে না। কুরুচিপূর্ণ পরিবর্তনযোগ্য রাষ্ট্র traditionতিহ্যগতভাবে ফাংশন আর্গুমেন্ট বা বৈশ্বিক ভেরিয়েবলের অবস্থার পরিবর্তনকে বোঝায়, তবে এই পদ্ধতির দ্বারা কেবল স্থানীয়ভাবে স্কোপড ভেরিয়েবলের অবস্থা সংশোধন করা হয় যা প্রতিশ্রুতির ফলাফলকে একত্র করার একমাত্র উদ্দেশ্যে ... একটি পরিবর্তনশীল যা একটি সাধারণ মৃত্যুবরণ করবে প্রতিশ্রুতি সমাধান একবার।
  • মধ্যবর্তী প্রতিশ্রুতিগুলির ফলাফলের স্থিতি অ্যাক্সেস করা থেকে বাধা দেওয়া হয় না, তবে এটি এমন কিছু ভীতিজনক পরিস্থিতি প্রবর্তন করে না যেখানে শৃঙ্খলে প্রতিশ্রুতিগুলির মধ্যে একটি প্রতিশ্রুতিবদ্ধ হবে এবং আপনার ফলাফলকে নাশকতা করবে। প্রতিশ্রুতির প্রতিটি পদক্ষেপে মূল্যবোধ নির্ধারণের দায়িত্বটি এই ফাংশনটিতে সীমাবদ্ধ এবং সামগ্রিক ফলাফলটি সঠিক বা ভুল হবে ... এটি এমন কিছু বাগ হবে না যা বছরের পর বছর উত্পাদনে কাটা হবে (আপনি যদি না চান তবে) !)
  • এটি এমন একটি রেস কন্ডিশনের দৃশ্যের প্রবর্তন করে না যা সমান্তরাল অনুরোধ থেকে উত্থিত হয় কারণ ফলাফলের পরিবর্তনশীলটির একটি নতুন উদাহরণটি getExample ফাংশনের প্রতিটি অনুরোধের জন্য তৈরি করা হয়।


ধন্যবাদ @ বেরগি, আপনি যতক্ষণ না উল্লেখ করেছেন ততক্ষণ আমি বুঝতেও পারি নি যে এটি একটি অ্যান্টি-প্যাটার্ন ছিল!
জে

প্রতিশ্রুতি সম্পর্কিত ত্রুটি প্রশমিত করার পক্ষে এটি ভাল কাজ I আমি ইএস 5 ব্যবহার করছিলাম এবং প্রতিশ্রুতি নিয়ে কাজ করার জন্য অন্য লাইব্রেরি যুক্ত করতে চাইনি।
নীলকণ্ঠ সিংহ দেও

8

নোড 7.4 এখন সংহতি পতাকা সহ অ্যাসিঙ্ক / অপেক্ষা কলগুলি সমর্থন করে।

এটা চেষ্টা কর:

async function getExample(){

  let response = await returnPromise();

  let response2 = await returnPromise2();

  console.log(response, response2)

}

getExample()

এবং এর সাথে ফাইলটি চালান:

node --harmony-async-await getExample.js

সহজ হতে পারে!


8

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

অনুসারে কিভাবে-থেকে-শৃঙ্খল-জাভাস্ক্রিপ্ট-প্রতিশ্রুতি

ঠিক আছে, কোডটি দেখুন:

const firstPromise = () => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log('first promise is completed');
            resolve({data: '123'});
        }, 2000);
    });
};

const secondPromise = (someStuff) => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log('second promise is completed');
            resolve({newData: `${someStuff.data} some more data`});
        }, 2000);
    });
};

const thirdPromise = (someStuff) => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log('third promise is completed');
            resolve({result: someStuff});
        }, 2000);
    });
};

firstPromise()
    .then(secondPromise)
    .then(thirdPromise)
    .then(data => {
        console.log(data);
    });

4
এটি শৃঙ্খলে পূর্ববর্তী ফলাফলগুলিতে কীভাবে অ্যাক্সেস করবেন সে সম্পর্কে সত্যই প্রশ্নের উত্তর দেয় না।
বার্গি

2
প্রতিটি প্রতিশ্রুতি পূর্বের মান পেতে পারে, আপনার অর্থ কি?
yzfdjzwl

1
প্রশ্নের কোডটি একবার দেখুন। উদ্দেশ্যটি .thenবলা হয় যে প্রতিশ্রুতি দেওয়া হয়েছে তার ফলাফল পাওয়া নয়, তার আগে থেকেই ফলাফল results যেমন thirdPromiseফলাফল অ্যাক্সেস firstPromise
বার্গি

6

আর একটি উত্তর, babel-nodeসংস্করণ <6 ব্যবহার করে

ব্যবহার async - await

npm install -g babel@5.6.14

example.js:

async function getExample(){

  let response = await returnPromise();

  let response2 = await returnPromise2();

  console.log(response, response2)

}

getExample()

তারপরে, দৌড়ে babel-node example.jsগিয়ে ভয়েলা!


1
হ্যাঁ আমি করেছি, ঠিক আমার পোস্ট করার পরে। তবুও, আমি এটি ছেড়ে চলে যাচ্ছি কারণ এটি ব্যাখ্যা করে যে কীভাবে ES7 ব্যবহার করে বাস্তবে উঠতে হবে এবং কোনও দিন ES7 পাওয়া যাবে তার বিপরীতে এটি কীভাবে চালানো যায়।
অ্যান্থনি

1
ওহ ঠিক আছে, আমার এই উত্তরটি আপডেট করতে হবে যে এগুলির জন্য "পরীক্ষামূলক" প্লাগইনগুলি ইতিমধ্যে এখানে রয়েছে।
বার্গি

2

আমি বিশ্বব্যাপী ভেরিয়েবলগুলি ব্যবহারের বড় অনুরাগী না হওয়ায় আমি নিজের কোডটিতে এই প্যাটার্নটি ব্যবহার করব না। তবে এক চিমটে এটি কাজ করবে will

ব্যবহারকারী একটি প্রস্তাবিত মঙ্গুজ মডেল।

var globalVar = '';

User.findAsync({}).then(function(users){
  globalVar = users;
}).then(function(){
  console.log(globalVar);
});

2
লক্ষ্য করুন যে এই প্যাটার্নটি ইতিমধ্যে পরিবর্তনীয় প্রাসঙ্গিক রাষ্ট্রের উত্তরে বর্ণিত হয়েছে (এবং এটি কেন কুরুচিপূর্ণ - আমিও কোনও বড় অনুরাগী নই)
বার্গি

আপনার ক্ষেত্রে, প্যাটার্নটি যদিও অকেজো বলে মনে হচ্ছে। তোমার মোটেই দরকার নেই globalVar, তাই না User.findAsync({}).then(function(users){ console.log(users); mongoose.connection.close() });?
বার্গি

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

2

সিক্যুয়াল এক্সিকিউটর এনসিনজ ব্যবহার করে অন্য একটি উত্তর :

function getExample(){

  var response1 = returnPromise1().data;

  // promise1 is resolved at this point, '.data' has the result from resolve(result)

  var response2 = returnPromise2().data;

  // promise2 is resolved at this point, '.data' has the result from resolve(result)

  console.log(response, response2);

}

nynjs.run(getExample,{},function(){
    console.log('all done');
})

আপডেট: কাজের উদাহরণ যুক্ত করা হয়েছে

function synchronousCode() {
     var urls=[
         "https://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js",
         "https://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js",
         "https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"
     ];
     for(var i=0; i<urls.length; i++) {
         var len=window.fetch(urls[i]).data.text().data.length;
         //             ^                   ^
         //             |                   +- 2-nd promise result
         //             |                      assigned to 'data'
         //             |
         //             +-- 1-st promise result assigned to 'data'
         //
         console.log('URL #'+i+' : '+urls[i]+", length: "+len);
     }
}

nsynjs.run(synchronousCode,{},function(){
    console.log('all done');
})
<script src="https://rawgit.com/amaksr/nsynjs/master/nsynjs.js"></script>


1

ব্লুবার্ড ব্যবহার করার সময়, আপনি .bindপ্রতিশ্রুতি শৃঙ্খলে ভেরিয়েবলগুলি ভাগ করতে পদ্ধতিটি ব্যবহার করতে পারেন :

somethingAsync().bind({})
.spread(function (aValue, bValue) {
    this.aValue = aValue;
    this.bValue = bValue;
    return somethingElseAsync(aValue, bValue);
})
.then(function (cValue) {
    return this.aValue + this.bValue + cValue;
});

আরও তথ্যের জন্য দয়া করে এই লিঙ্কটি দেখুন:

http://bluebirdjs.com/docs/api/promise.bind.html


লক্ষ্য করুন যে এই প্যাটার্নটি ইতিমধ্যে পরিবর্তনীয় প্রাসঙ্গিক রাষ্ট্রের উত্তরে
বার্গি


1

আমি মনে করি আপনি আরএসভিপি এর হ্যাশ ব্যবহার করতে পারেন।

নীচের মত কিছু:

    const mainPromise = () => {
        const promise1 = new Promise((resolve, reject) => {
            setTimeout(() => {
                console.log('first promise is completed');
                resolve({data: '123'});
            }, 2000);
        });

        const promise2 = new Promise((resolve, reject) => {
            setTimeout(() => {
                console.log('second promise is completed');
                resolve({data: '456'});
            }, 2000);
        });

        return new RSVP.hash({
              prom1: promise1,
              prom2: promise2
          });

    };


   mainPromise()
    .then(data => {
        console.log(data.prom1);
        console.log(data.prom2);
    });

হ্যাঁ, এটি Promise.allসমাধান হিসাবে একই , কেবলমাত্র অ্যারের পরিবর্তে কোনও বস্তুর সাথে।
বার্গি

0

সমাধান:

আপনি 'বাইন্ড' ব্যবহার করে স্পষ্টভাবে যে কোনও 'তারপর' ফাংশনে মধ্যবর্তী মানগুলি স্কোপটিতে রাখতে পারেন। এটি একটি দুর্দান্ত সমাধান যা প্রতিশ্রুতিগুলি কীভাবে কাজ করে তা পরিবর্তনের প্রয়োজন হয় না এবং ত্রুটিগুলি ইতিমধ্যে প্রচারিত হওয়ার মতো মানগুলি প্রচারের জন্য কেবল একটি লাইন বা দুটি কোডের প্রয়োজন হয় requires

এখানে একটি সম্পূর্ণ উদাহরণ:

// Get info asynchronously from a server
function pGetServerInfo()
    {
    // then value: "server info"
    } // pGetServerInfo

// Write into a file asynchronously
function pWriteFile(path,string)
    {
    // no then value
    } // pWriteFile

// The heart of the solution: Write formatted info into a log file asynchronously,
// using the pGetServerInfo and pWriteFile operations
function pLogInfo(localInfo)
    {
    var scope={localInfo:localInfo}; // Create an explicit scope object
    var thenFunc=p2.bind(scope); // Create a temporary function with this scope
    return (pGetServerInfo().then(thenFunc)); // Do the next 'then' in the chain
    } // pLogInfo

// Scope of this 'then' function is {localInfo:localInfo}
function p2(serverInfo)
    {
    // Do the final 'then' in the chain: Writes "local info, server info"
    return pWriteFile('log',this.localInfo+','+serverInfo);
    } // p2

এই সমাধানটি নিম্নরূপ আহবান করা যেতে পারে:

pLogInfo("local info").then().catch(err);

(দ্রষ্টব্য: এই সমাধানটির আরও জটিল এবং সম্পূর্ণ সংস্করণ পরীক্ষা করা হয়েছে, তবে এই উদাহরণ সংস্করণটি নয়, সুতরাং এটিতে একটি বাগ থাকতে পারে))


এটি নেস্টিং (এবং) ক্লোজার উত্তরগুলির মতো একই প্যাটার্ন বলে মনে হচ্ছে
বার্গি

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

async/ awaitএখনও মানে প্রতিশ্রুতি ব্যবহার করা। আপনি যা পরিত্যাগ করতে পারেন তা হল thenকলব্যাক সহ কল।
বার্গি

-1

প্রতিশ্রুতি সম্পর্কে আমি যা শিখি তা হ'ল এটি কেবল ব্যবহার হিসাবে সম্ভব যদি সম্ভব হয় তবে তাদের রেফারেন্স এড়ায়। অ্যাসিঙ্ক / অপেক্ষার বাক্য গঠন বিশেষত এটির জন্য ব্যবহারিক। আজ সমস্ত সাম্প্রতিক ব্রাউজার এবং নোড এটিকে সমর্থন করে: https://caniuse.com/#feat=async-funitions , একটি সাধারণ আচরণ এবং কোডটি সিঙ্ক্রোনাস কোড পড়ার মতো, কলব্যাকগুলি ভুলে যান ...

ক্ষেত্রে যখন আমাকে কোনও প্রতিশ্রুতিগুলির রেফারেন্স দেওয়ার দরকার হয় তখন যখন স্বাধীন / না-সম্পর্কিত জায়গায় সৃষ্টি ও রেজোলিউশন ঘটে। সুতরাং পরিবর্তে একটি কৃত্রিম সমিতি এবং সম্ভবত কোনও ইভেন্ট শ্রোতা কেবল "দূরবর্তী" প্রতিশ্রুতি সমাধানের জন্য, আমি প্রতিশ্রুতিটিকে মুলতুবি হিসাবে প্রকাশ করতে পছন্দ করি, যা নিম্নলিখিত কোডটি বৈধ এস 5 এ প্রয়োগ করে

/**
 * Promise like object that allows to resolve it promise from outside code. Example:
 *
```
class Api {
  fooReady = new Deferred<Data>()
  private knower() {
    inOtherMoment(data=>{
      this.fooReady.resolve(data)
    })
  }
}
```
 */
var Deferred = /** @class */ (function () {
  function Deferred(callback) {
    var instance = this;
    this.resolve = null;
    this.reject = null;
    this.status = 'pending';
    this.promise = new Promise(function (resolve, reject) {
      instance.resolve = function () { this.status = 'resolved'; resolve.apply(this, arguments); };
      instance.reject = function () { this.status = 'rejected'; reject.apply(this, arguments); };
    });
    if (typeof callback === 'function') {
      callback.call(this, this.resolve, this.reject);
    }
  }
  Deferred.prototype.then = function (resolve) {
    return this.promise.then(resolve);
  };
  Deferred.prototype.catch = function (r) {
    return this.promise.catch(r);
  };
  return Deferred;
}());

আমার একটি টাইপ স্ক্রিপ্ট প্রকল্প রূপান্তরিত:

https://github.com/cancerberoSgx/misc-utils-of-mine/blob/2927c2477839f7b36247d054e7e50abe8a41358b/misc-utils-of-mine-generic/src/promise.ts#L31

আরও জটিল ক্ষেত্রে আমি প্রায়শই পরীক্ষিত এবং টাইপ করা নির্ভরতা ছাড়াই এই লোকের ছোট প্রতিশ্রুতি উপযোগিতা ব্যবহার করি। পি-ম্যাপটি বেশ কয়েকবার কার্যকর হয়েছে। আমি মনে করি তিনি বেশিরভাগ ব্যবহারের মামলাগুলি কভার করেছেন:

https://github.com/sindresorhus?utf8=%E2%9C%93&tab=repositories&q=promise&type=source&language=



@ বার্গি প্রথমবারের মতো আমি এই নামগুলিতে নেতৃত্ব দিচ্ছি to তালিকাকে ধন্যবাদ জানিয়ে আমি এই জাতীয় আত্ম-সচেতন প্রতিশ্রুতিগুলি ডিফার্ডের নামে জানি - বিটিডব্লিউ বাস্তবায়ন কেবল সঙ্কটযুক্ত জড়িত একটি প্রতিশ্রুতি। প্রতিশ্রুতি তৈরি এবং রেজোলিউশনের দায়িত্ব স্বতন্ত্র যেখানে কেবলমাত্র প্রতিশ্রুতি সমাধানের জন্য তাদের সম্পর্কিত করার দরকার নেই সে ক্ষেত্রে আমার প্রায়শই এই প্যাটার্নটি প্রয়োজন। আমি অভিযোজিত কিন্তু আপনার উদাহরণের জন্য না, এবং একটি ক্লাস ব্যবহার করে, তবে সমমান হতে পারে।
ক্যান্সারবেরো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.