প্রতিশ্রুতি। সমস্ত ()। তারপর () সমাধান?


96

নোড ব্যবহার করে 4.x. যখন আপনার কাছে Promise.all(promises).then()কোনটি থাকে তখন ডেটা সমাধান করার এবং পরবর্তীটিতে পাস করার উপযুক্ত উপায় .then()কী?

আমি এরকম কিছু করতে চাই:

Promise.all(promises).then(function(data){
  // Do something with the data here
}).then(function(data){
  // Do more stuff here
});

তবে আমি কীভাবে 2 য়-তে ডেটা পাবেন তা নিশ্চিত নই .then()। আমি resolve(...)প্রথম ব্যবহার করতে পারি না .then()। আমি বুঝতে পারি আমি এটি করতে পারি:

return Promise.all(promises).then(function(data){
  // Do something with the data here
  return data;
}).then(function(data){
  // Do more stuff here
});

তবে এটি করার সঠিক উপায় বলে মনে হচ্ছে না ... এটির সঠিক পন্থাটি কী?

উত্তর:


143

তবে এটি করার যথাযথ উপায় বলে মনে হচ্ছে না ..

এটি প্রকৃতপক্ষে এটি করার সঠিক উপায় (বা এটি করার জন্য কমপক্ষে একটি সঠিক উপায়)। এটি প্রতিশ্রুতির মূল দিক, এগুলি একটি পাইপলাইন এবং পাইপলাইনে বিভিন্ন হ্যান্ডলাররা ডেটা ম্যাসেজ করতে পারে।

উদাহরণ:

const promises = [
  new Promise(resolve => setTimeout(resolve, 0, 1)),
  new Promise(resolve => setTimeout(resolve, 0, 2))
];
Promise.all(promises)
  .then(data => {
    console.log("First handler", data);
    return data.map(entry => entry * 10);
  })
  .then(data => {
    console.log("Second handler", data);
  });

( catchব্র্যান্ডটির জন্য হ্যান্ডলার বাদ দেওয়া হয়েছে production উত্পাদন কোডে সর্বদা হয় প্রতিশ্রুতি প্রচার করুন, বা প্রত্যাখ্যান পরিচালনা করবেন))

আমরা যে আউটপুটটি দেখতে পাই তা হ'ল:

প্রথম হ্যান্ডলার [1,2]
দ্বিতীয় হ্যান্ডলার [10,20]

... কারণ প্রথম হ্যান্ডলারটি দুটি প্রতিশ্রুতি ( 1এবং 2) হিসাবে অ্যারের হিসাবে সমাধান পেয়ে যায় এবং তারপরে 10 দ্বারা গুণিত প্রতিটিগুলির সাথে একটি নতুন অ্যারে তৈরি করে এবং তা ফেরত দেয়। দ্বিতীয় হ্যান্ডলার প্রথম হ্যান্ডলার যা ফিরে আসে তা পায়।

আপনি যে অতিরিক্ত কাজটি করছেন তা যদি সিনক্রোনাস হয় তবে আপনি এটি প্রথম হ্যান্ডলারের মধ্যেও রাখতে পারেন :

উদাহরণ:

const promises = [
  new Promise(resolve => setTimeout(resolve, 0, 1)),
  new Promise(resolve => setTimeout(resolve, 0, 2))
];
Promise.all(promises)
  .then(data => {
    console.log("Initial data", data);
    data = data.map(entry => entry * 10);
    console.log("Updated data", data);
    return data;
  });

... তবে এটি যদি অবিচ্ছিন্ন হয় তবে আপনি এটি করতে চাইবেন না কারণ এটি বাসা বেঁধে শেষ হবে এবং বাসা বাঁধে তাড়াতাড়ি হাত থেকে বেরিয়ে আসতে পারে।


4
মজাদার. ধন্যবাদ. তাহলে rejectপ্রাথমিক কাজটির পরে কোনও মান পাওয়া সম্ভব নয় Promiseকি? অথবা চেইনের যে কোনও জায়গায় কোনও ত্রুটি ছুঁড়ে ফেলা কি আপনাকে সেখানে নিয়ে যাবে .catch()? যদি তা হয়, rejectতবে প্রথম স্থানটির বিন্দুটি কী ? শুধু ত্রুটি ছোঁড়াবেন না কেন? আবার ধন্যবাদ,
জ্যাক উইলসন

6
@ জ্যাকউইলসন: এগুলি বিভিন্ন প্রশ্ন। তবে আপনি দুটি পৃথক বিষয়কে বিভ্রান্ত করছেন: প্রতিশ্রুতি তৈরি করা এবং তা নিষ্পত্তি করা এবং প্রতিশ্রুতি পরিচালনা করা । আপনি তৈরি এবং প্রতিশ্রুতি প্রতিষ্ঠাপন করছেন, তখন আপনি ব্যবহার resolveএবং reject। আপনি যখন পরিচালনা করছেন , যদি আপনার প্রসেসিং ব্যর্থ হয় তবে আপনি ব্যর্থতার পথে ট্রিগার করতে ব্যতিক্রমকে ছুঁড়ে ফেলবেন। এবং হ্যাঁ, আপনি মূল Promiseকলব্যাক (ব্যবহার rejectনা করে ) থেকেও একটি ব্যতিক্রম ছুঁড়ে ফেলতে পারেন তবে সমস্ত ব্যর্থতা ব্যতিক্রম নয়।
টিজে ক্রাউডার

2

আপনার return dataপদ্ধতিটি সঠিক, এটি প্রতিশ্রুতিবদ্ধ শৃঙ্খলার একটি উদাহরণ । আপনি যদি আপনার .then()কলব্যাক থেকে কোনও প্রতিশ্রুতি ফিরিয়ে দেন , জাভাস্ক্রিপ্ট সেই প্রতিশ্রুতিটি সমাধান করবে এবং ডেটাটি পরবর্তী then()কলব্যাকে প্রেরণ করবে ।

কেবল সতর্কতা অবলম্বন করুন এবং নিশ্চিত করুন যে আপনি ত্রুটিগুলি হ্যান্ডেল করেছেন .catch()Promise.all()অ্যারে প্রতিশ্রুতি এক সাথে সাথে প্রত্যাখ্যান


1

আজ নোডজেএস নতুন async/awaitসিনট্যাক্স সমর্থন করে। এটি একটি সহজ বাক্য গঠন এবং জীবনকে আরও সহজ করে তোলে

async function process(promises) { // must be an async function
    let x = await Promise.all(promises);  // now x will be an array
    x = x.map( tmp => tmp * 10);              // proccessing the data.
}

const promises = [
   new Promise(resolve => setTimeout(resolve, 0, 1)),
   new Promise(resolve => setTimeout(resolve, 0, 2))
];

process(promises)

আরও জানুন:


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