প্রতিশ্রুতি


265

আমার কাছে প্রতিশ্রুতির একটি বিন্যাস রয়েছে যা আমি সমাধান করছি Promise.all(arrayOfPromises);

আমি প্রতিশ্রুতি শৃঙ্খলা অব্যাহত রাখি। এরকম কিছু দেখাচ্ছে

existingPromiseChain = existingPromiseChain.then(function() {
  var arrayOfPromises = state.routes.map(function(route){
    return route.handler.promiseHandler();
  });
  return Promise.all(arrayOfPromises)
});

existingPromiseChain = existingPromiseChain.then(function(arrayResolved) {
  // do stuff with my array of resolved promises, eventually ending with a res.send();
});

আমি পৃথক প্রতিশ্রুতি ত্রুটির ক্ষেত্রে পরিচালনা করতে একটি ক্যাচ স্টেটমেন্ট যুক্ত করতে চাই, তবে যখন আমি চেষ্টা করি তখন Promise.allএটি খুঁজে পাওয়া প্রথম ত্রুটিটি ফিরে আসে (বাকী অংশগুলি উপেক্ষা করে), এবং তারপরে আমি বাকী প্রতিশ্রুতিগুলির থেকে ডেটা পেতে পারি না অ্যারে (যে ত্রুটি হয়নি)।

আমি কিছু করার চেষ্টা করেছি ..

existingPromiseChain = existingPromiseChain.then(function() {
      var arrayOfPromises = state.routes.map(function(route){
        return route.handler.promiseHandler()
          .then(function(data) {
             return data;
          })
          .catch(function(err) {
             return err
          });
      });
      return Promise.all(arrayOfPromises)
    });

existingPromiseChain = existingPromiseChain.then(function(arrayResolved) {
      // do stuff with my array of resolved promises, eventually ending with a res.send();
});

কিন্তু সমাধান হয় না।

ধন্যবাদ!

-

সম্পাদনা:

নীচের উত্তরগুলি যা বলেছিল তা সম্পূর্ণ সত্য ছিল, অন্যান্য কারণে এই কোডটি ভঙ্গ হচ্ছে। যদি কেউ আগ্রহী হন তবে এটিই সমাধানটি শেষ করেছিলাম ...

নোড এক্সপ্রেস সার্ভার চেইন

serverSidePromiseChain
    .then(function(AppRouter) {
        var arrayOfPromises = state.routes.map(function(route) {
            return route.async();
        });
        Promise.all(arrayOfPromises)
            .catch(function(err) {
                // log that I have an error, return the entire array;
                console.log('A promise failed to resolve', err);
                return arrayOfPromises;
            })
            .then(function(arrayOfPromises) {
                // full array of resolved promises;
            })
    };

এপিআই কল (রুট.অ্যাসেক কল)

return async()
    .then(function(result) {
        // dispatch a success
        return result;
    })
    .catch(function(err) {
        // dispatch a failure and throw error
        throw err;
    });

ফেলে .catchজন্য Promise.allসামনে .thenমূল প্রতিশ্রুতি থেকে কোন ত্রুটি সংক্রামক, কিন্তু তারপর পরবর্তী সম্পূর্ণ অ্যারে ফিরে উদ্দেশ্য পরিবেশিত হয়েছে বলে মনে হয়.then

ধন্যবাদ!


2
আপনার চেষ্টাটি দেখে মনে হচ্ছে এটি কাজ করা উচিত… সম্ভবত পরে কোথাও অন্য সমস্যা আছে
রাই-

.then(function(data) { return data; })সম্পূর্ণরূপে বাদ দেওয়া যেতে পারে
বার্গি 21'15

উপরেরটি সমাধান না করার একমাত্র কারণ হ'ল যদি আপনি আমাদের thenবা catchহ্যান্ডলারে সমস্ত কোড না দেখিয়ে থাকেন এবং ভিতরে কোনও ত্রুটি রয়েছে। যাইহোক, এই নোড হয়?

1
আপনার "বিদ্যমান চেইন" এ আপনার কোনও চূড়ান্ত ধরা নেই, সুতরাং এমন কিছু ত্রুটি থাকতে পারে যা আপনি দেখছেন না এটি ব্যাখ্যা করতে পারে যে এটি কেন "সমাধান করে না"। এটি যুক্ত করার চেষ্টা করুন এবং দেখুন আপনি কী ত্রুটি পান।
jib

উত্তর:


189

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

কিছু লাইব্রেরিতে কিছু কল রয়েছে Promise.whenযা আমি বুঝতে পেরেছিলাম অ্যারের সমস্ত প্রতিশ্রুতি সমাধান বা প্রত্যাখ্যান করার পরিবর্তে অপেক্ষা করবে তবে আমি এর সাথে পরিচিত নই, এবং এটি ES6 এ নেই E

তোমার গোপন সংকেত

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

কেন এটি "সমাধান হবে না" তা আমি কেবল কারণেই ভাবতে পারি যে এটি কোডে ব্যর্থ হচ্ছে আপনি আমাদের প্রদর্শন করছেন না এবং কারণ সম্পর্কে আপনি কোনও ত্রুটি বার্তা দেখছেন না কারণ এই প্রতিশ্রুতি চূড়ান্তটি চূড়ান্ত সাথে শেষ করা হয়নি ধরা (আপনি আমাদের যাহাই হউক না কেন প্রদর্শন করছেন)

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

Promise.all(state.routes.map(function(route) {
  return route.handler.promiseHandler().catch(function(err) {
    return err;
  });
}))
.then(function(arrayOfValuesOrErrors) {
  // handling of my array containing values and/or errors. 
})
.catch(function(err) {
  console.log(err.message); // some coding error in handling happened
});

4
আপনি (এবং উপরের মন্তব্যগুলি) ঠিক বলেছেন। আমার রুট.হান্ডেলআর.প্রোমাইন্ড হ্যান্ডলারের প্রয়োজন। ক্যাচ () এবং ত্রুটি ফিরে। আমার চেইনের শেষে চূড়ান্ত .ক্যাচ () যোগ করতে হবে। শৃঙ্খলার প্রতিটি পদক্ষেপে সাফল্য / ত্রুটি হ্যান্ডলারগুলি রাখার গুরুত্বটি রিলে করার জন্য ধন্যবাদ :)।
জোন

2
আমি এটিও জানতে পেরেছিলাম যে আমি আমার। ক্যাচ () এ ত্রুটিটি যদি রুট.হান্ডার আউটপ্রেম হ্যান্ডলারের জন্য ফেলে দিই, তবে এটি স্বয়ংক্রিয়ভাবে চূড়ান্ত ধরা পড়বে। আমি পরিবর্তে ত্রুটিটি ফিরিয়ে দিলে এটি আমার যা ইচ্ছা তা করবে এবং পুরো অ্যারে পরিচালনা করবে।
জোন

2
Promise.allSettled()শালীন সমর্থন সহ এখন একটি মানক পদ্ধতি রয়েছে। রেফারেন্স দেখুন ।
আন্দ্রে মাগার্স

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

143

নতুন উত্তর

const results = await Promise.all(promises.map(p => p.catch(e => e)));
const validResults = results.filter(result => !(result instanceof Error));

ভবিষ্যতের প্রতিশ্রুতি এপিআই

  • ক্রোম: 76: https://developer.mozilla.org/en-US/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স / গ্লোবাল_অবজেক্টস / প্রমিজ / সমস্ত সেটলেট
  • এখনই তা পেতে আপনি https://www.npmjs.com/package/promise.allsettled ডাউনলোড করতে পারেন । নির্দিষ্ট ব্রাউজারগুলিতে সমস্ত সেটলেট করা ব্রাউজারের সাথেই ইনস্টল করা হয়। মানসিক শান্তির জন্য প্যাকেজটি ডাউনলোড করা মূল্যবান কারণ যেমন। AllSettled এর জন্য টাইপস্ক্রিপ্টের ডিফল্ট সংজ্ঞা নেই।

11
যদিও eএকটি হতে হবে না Error। এটি একটি স্ট্রিং হতে পারে, উদাহরণস্বরূপ, যদি কেউ এটি পছন্দ করে Promise.reject('Service not available')
ক্লেসুন

@ আর্তরক্লেসুন তখন আমরা কীভাবে প্রতিশ্রুতিতে ত্রুটি ঘটায় এবং কোনটি হয়নি তা শ্রেণিবদ্ধ করতে পারি?
শুভম জৈন

5
@ শুভম-জয়ন সহ .then()এবং .catch()। পূর্বেরটির কাছে Promise.resolve()মূল্য Promise.reject()প্রেরণ করা হবে , তবে এটি পরেরটির কাছে প্রেরণ করবে। আপনি উদাহরণস্বরূপ বস্তু তাদের মোড়ানো করতে পারেন: p.then(v => ({success: true, value: v})).catch(e => ({success: false, error: e}))
ক্লেসুন

2
আপনি ফলাফলগুলি ফিল্টার করবেন কেন? ফলাফলগুলি দিয়ে আপনি কিছু করছেন কিনা তার কোনও অর্থ নেই - কোন প্রতিশ্রুতি থেকে প্রত্যাশিত মানটি কী তা জানতে আপনার ক্রমটি প্রয়োজন!
রায়ান টেলর

21

Promise.allলুপটি চালিয়ে যেতে (এমনকি যখন কোনও প্রতিশ্রুতি প্রত্যাখ্যান হয়) আমি একটি ইউটিলিটি ফাংশন লিখেছিলাম যা বলা হয় executeAllPromises। এই ইউটিলিটি ফাংশনটি resultsএবং এর সাথে একটি বস্তু প্রদান করে errors

ধারণাটি হল যে আপনি যে প্রতিশ্রুতিগুলি পাস করেছেন executeAllPromisesসেগুলি একটি নতুন প্রতিশ্রুতিতে আবৃত হবে যা সর্বদা সমাধান হবে। নতুন প্রতিশ্রুতিটি এমন একটি অ্যারের সাথে সমাধান হয়েছে যার 2 টি দাগ রয়েছে। প্রথম স্থানটি সমাধানকারী মান (যদি থাকে তবে) ধরে রাখে এবং দ্বিতীয় স্থানটি ত্রুটি রাখে (যদি মোড়ানো প্রতিশ্রুতি প্রত্যাখাত হয়)।

একটি চূড়ান্ত পদক্ষেপ হিসাবে executeAllPromisesমোড়ক প্রতিশ্রুতিগুলির সমস্ত মান একত্রিত করে এবং এর জন্য একটি অ্যারের সাথে চূড়ান্ত বস্তুটি resultsপ্রদান করে errors

কোডটি এখানে:

function executeAllPromises(promises) {
  // Wrap all Promises in a Promise that will always "resolve"
  var resolvingPromises = promises.map(function(promise) {
    return new Promise(function(resolve) {
      var payload = new Array(2);
      promise.then(function(result) {
          payload[0] = result;
        })
        .catch(function(error) {
          payload[1] = error;
        })
        .then(function() {
          /* 
           * The wrapped Promise returns an array:
           * The first position in the array holds the result (if any)
           * The second position in the array holds the error (if any)
           */
          resolve(payload);
        });
    });
  });

  var errors = [];
  var results = [];

  // Execute all wrapped Promises
  return Promise.all(resolvingPromises)
    .then(function(items) {
      items.forEach(function(payload) {
        if (payload[1]) {
          errors.push(payload[1]);
        } else {
          results.push(payload[0]);
        }
      });

      return {
        errors: errors,
        results: results
      };
    });
}

var myPromises = [
  Promise.resolve(1),
  Promise.resolve(2),
  Promise.reject(new Error('3')),
  Promise.resolve(4),
  Promise.reject(new Error('5'))
];

executeAllPromises(myPromises).then(function(items) {
  // Result
  var errors = items.errors.map(function(error) {
    return error.message
  }).join(',');
  var results = items.results.join(',');
  
  console.log(`Executed all ${myPromises.length} Promises:`);
  console.log(`— ${items.results.length} Promises were successful: ${results}`);
  console.log(`— ${items.errors.length} Promises failed: ${errors}`);
});


2
এটি সহজ করা যেতে পারে। স্ট্যাকওভারফ্লো.com
a/

18

ES2020 প্রতিশ্রুতি প্রকারের জন্য নতুন পদ্ধতি প্রবর্তন করে: Promise.allSettled()
সমস্ত ইনপুট প্রতিশ্রুতি নিষ্পত্তি হওয়ার পরে প্রতিশ্রুতি.সেলসেটলড আপনাকে একটি সংকেত দেয়, যার অর্থ তারা হয় পূরণ হয় বা প্রত্যাখ্যানিত হয়। আপনি যখন প্রতিশ্রুতির অবস্থার বিষয়ে চিন্তা করেন না এমন ক্ষেত্রে এটি কার্যকর, আপনি সফল হয়েছিলেন কিনা তা বিবেচনা না করেই কাজটি কখন সম্পন্ন হবে তা আপনি জানতে চান।

const promises = [
  fetch('/api-call-1'),
  fetch('/api-call-2'),
  fetch('/api-call-3'),
];
// Imagine some of these requests fail, and some succeed.

const result = await Promise.allSettled(promises);
console.log(result.map(x=>s.status));
// ['fulfilled', 'fulfilled', 'rejected']

ভি 8 ব্লগ পোস্টে আরও পড়ুন https://v8.dev/features/promise-combinators


13

@ জিব যেমন বলেছেন,

Promise.all সব বা কিছুই না।

যদিও, আপনি কিছু প্রতিশ্রুতি নিয়ন্ত্রণ করতে পারেন যা "অনুমোদিত" ব্যর্থ হতে পারে এবং আমরা এগিয়ে যেতে চাই .then

উদাহরণ স্বরূপ.

  Promise.all([
    doMustAsyncTask1,
    doMustAsyncTask2,
    doOptionalAsyncTask
    .catch(err => {
      if( /* err non-critical */) {
        return
      }
      // if critical then fail
      throw err
    })
  ])
  .then(([ mustRes1, mustRes2, optionalRes ]) => {
    // proceed to work with results
  })

6

আপনি যদি Q লাইব্রেরি https://github.com/kriskowal/q ব্যবহার করতে পান তবে এটিতে q.allSettled () পদ্ধতি রয়েছে যা এই সমস্যার সমাধান করতে পারে আপনি তার প্রতিস্থাপনের উপর নির্ভর করে প্রতিটি প্রতিশ্রুতি পুরোপুরিভাবে বাতিল বা প্রত্যাখ্যান করতে পারেন

existingPromiseChain = existingPromiseChain.then(function() {
var arrayOfPromises = state.routes.map(function(route){
  return route.handler.promiseHandler();
});
return q.allSettled(arrayOfPromises)
});

existingPromiseChain = existingPromiseChain.then(function(arrayResolved) {
//so here you have all your promises the fulfilled and the rejected ones
// you can check the state of each promise
arrayResolved.forEach(function(item){
   if(item.state === 'fulfilled'){ // 'rejected' for rejected promises
     //do somthing
   } else {
     // do something else
   }
})
// do stuff with my array of resolved promises, eventually ending with a res.send();
});

যেহেতু আপনি কয়েকটি গ্রন্থাগার ( q) ব্যবহারের পরামর্শ দিচ্ছেন তাই আপনি যদি প্রশ্ন সম্পর্কিত কোনও ব্যবহারের উদাহরণ সরবরাহ করেন তবে এটি আরও কার্যকর হবে। যেমনটি দাঁড়িয়েছে, আপনার উত্তরটি ব্যাখ্যা করে না যে এই লাইব্রেরি কীভাবে সমস্যা সমাধানে সহায়তা করতে পারে।
ishmaelMakitla

প্রস্তাবিত হিসাবে একটি উদাহরণ যুক্ত
মোহাম্মদ মাহমুদ

1
সর্দা 2018 এর মধ্যে সর্বদা একজনের সিন্ড্রে কী উপলব্ধ রয়েছে তা দেখতে হবে :-)। github.com/sindresorhus/p-settle । সিন্ডারের একক উদ্দেশ্য মডিউলগুলির সাথে আপনাকে কেবলমাত্র একটি বিটের জন্য q এর মতো বিশাল লাইব্রেরি আমদানি করতে হবে না।
ডি কেবলার

6

অ্যাসিঙ্ক অপেক্ষা করুন -

এখানে একটি অ্যাসিঙ্ক ফাংশন ফানক 1 একটি সমাধান করা মান ফিরিয়ে দিচ্ছে, এবং ফানক 2 একটি ত্রুটি ছুঁড়েছে এবং এই পরিস্থিতিতে একটি শূন্যতা ফিরিয়ে দিচ্ছে, আমরা কীভাবে চাই তা এটি পরিচালনা করতে পারি এবং তদনুসারে ফিরে আসতে পারি।

const callingFunction  = async () => {
    const manyPromises = await Promise.all([func1(), func2()]);
    console.log(manyPromises);
}


const func1 = async () => {
    return 'func1'
}

const func2 = async () => {
    try {
        let x;
        if (!x) throw "x value not present"
    } catch(err) {
       return null
    }
}

callingFunction();

আউটপুটটি হ'ল - ['ফানক 1', নাল]


4

এখানে হোঁচট খাওয়া ES8 ব্যবহারকারীদের জন্য, আপনি async ফাংশনগুলি ব্যবহার করে নীচের মতো কিছু করতে পারেন :

var arrayOfPromises = state.routes.map(async function(route){
  try {
    return await route.handler.promiseHandler();
  } catch(e) {
    // Do something to handle the error.
    // Errored promises will return whatever you return here (undefined if you don't return anything).
  }
});

var resolvedPromises = await Promise.all(arrayOfPromises);

3

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

এখানে আমি প্রথম প্রতিশ্রুতি প্রত্যাখ্যান করেছি, সুতরাং এটি অপরিজ্ঞাত হিসাবে আসে তবে আমরা দ্বিতীয় প্রতিশ্রুতির ফলাফলটি ব্যবহার করতে পারি, যা সূচক 1 এ রয়েছে।

const manyPromises = Promise.all([func1(), func2()]).then(result => {
    console.log(result[0]);  // undefined
    console.log(result[1]);  // func2
});

function func1() {
    return new Promise( (res, rej) => rej('func1')).catch(err => {
        console.log('error handled', err);
    });
}

function func2() {
    return new Promise( (res, rej) => setTimeout(() => res('func2'), 500) );
}


যদি আমরা অ্যাসিঙ্ক অপেক্ষা করে থাকি তবে আপনি কীভাবে একই কাজ করতে পারেন?
রুদ্রেশ আজগাঁওকার

আমি আপনার প্রশ্নের উত্তর দিয়েছি, দয়া করে উত্তরের লিঙ্কটি সন্ধান করুন। stackoverflow.com/a/55216763/4079716
নয়ন প্যাটেল

2

আপনি বিবেচনা করেছেন Promise.prototype.finally()?

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

থেকে MDN ডকুমেন্টেশন :

finally()আপনি যদি একবার প্রতিশ্রুতি বসতি স্থাপন কিছু প্রক্রিয়াকরণ বা পরিষ্করণ কাজ করতে চান তার পরিণতি নির্বিশেষে পদ্ধতি উপযোগী হতে পারে।

finally()পদ্ধতি খুব কলিং অনুরূপ .then(onFinally, onFinally)কিন্তু সেখানে পার্থক্য দম্পতি আছেন:

কোনও ফাংশন ইনলাইন তৈরি করার সময়, আপনি এটি একবারে পাস করতে পারেন, পরিবর্তে এটি দুটি বার ঘোষণা করার জন্য বাধ্য করা হয়েছে, বা এর জন্য একটি ভেরিয়েবল তৈরি করতে পারেন।

শেষ অবধি কলব্যাক কোনও যুক্তি পাবে না, যেহেতু প্রতিশ্রুতি পূরণ হয়েছে বা প্রত্যাখ্যাত হয়েছে তা নির্ধারণের কোনও নির্ভরযোগ্য উপায় নেই। আপনি যখন প্রত্যাখ্যান কারণ বা সিদ্ধি মূল্য সম্পর্কে চিন্তা করেন না তখন এই ব্যবহারের কেসটি হ'ল তাই, যাতে এটি সরবরাহ করার দরকার নেই।

এর বিপরীতে Promise.resolve(2).then(() => {}, () => {})(যা অপরিবর্তিত দিয়ে সমাধান করা হবে), Promise.resolve(2).finally(() => {})2 দিয়ে সমাধান করা হবে Similarly একইভাবে, Promise.reject(3).then(() => {}, () => {})(যা অপরিবর্তিত দিয়ে পরিপূর্ণ Promise.reject(3).finally(() => {})হবে ) এর সাথে প্রত্যাখ্যান করা হবে 3।

== ফলব্যাক ==

আপনার জাভাস্ক্রিপ্টের সংস্করণ যদি সমর্থন না করে তবে Promise.prototype.finally()আপনি জ্যাক আর্কিবাল্ড থেকে এই কাজটি ব্যবহার করতে পারেন :Promise.all(promises.map(p => p.catch(() => undefined)));


1
হ্যাঁ, যতক্ষণ না Promises.allSettled()আসলে বাস্তবায়িত হয় (এটা MDN দ্বারা নথিভুক্ত হচ্ছে এখানে ), তারপর Promises.all.finally()একই জিনিস সম্পন্ন করার জন্য মনে হবে। আমি এটি ব্যবহার করে
চলেছি

@ জামেস আপনি কেন এই মন্তব্যটিকে যথাযথ উত্তর হিসাবে করেন না? উত্তরের কোনওটিই ES6 এ উল্লেখ করে না allSettled()
প্রভিণ

@ প্রভিন - আমি যা বলতে পারি তা থেকে, allSettled()কোথাও প্রয়োগ করা হয়নি (এখনও), তাই আমি বাস্তবের সামনে যেতে চাই না। আমার সাফল্য ছিল Promises.all(myPromiseArray).finally()এবং এটি এই উত্তরের সাথে খাপ খায়। একবার allSettled()প্রকৃতপক্ষে উপস্থিত থাকলে, আমি এটি পরীক্ষা করতে পারি এবং এটি আসলে কীভাবে কাজ করে তা জানতে পারি। ততক্ষণ পর্যন্ত, ব্রাউজারগুলি আসলে কী বাস্তবায়ন করবে কে জানে? বিপরীতে আপনার সাম্প্রতিক তথ্য না থাকলে ...
জামেস

@ জামেস সত্য যে এটি এখনও খসড়া পর্যায়ে রয়েছে .. তবে সর্বশেষতম এফএফ এবং ক্রোম এটি সম্পূর্ণরূপে সমর্থন করে বলে মনে হচ্ছে .. এটির স্থিতিশীলতা সম্পর্কে নিশ্চিত নন .. মোজিলা ডক্স যাইহোক আমি যে পয়েন্টটি তৈরির চেষ্টা করছিলাম সেটি ছিল এটি খুঁজে পাওয়া অনেক সহজ হবে যদি এটি কোনও মন্তব্যের চেয়ে উত্তর ছিল .. তবে এটি আপনার কল যদিও :)
প্রভিন

@ প্রভিন - - আমি আমার মন্তব্য পোস্ট করার সময়, এটি কোথাও প্রয়োগ করা হয়নি। আমি সবেমাত্র ফায়ারফক্স এবং ক্রোমে পরীক্ষা করেছি: Promise.allSettledফায়ারফক্সে প্রয়োগ করা হয়নি তবে এটি ক্রোমে উপস্থিত রয়েছে বলে মনে হয়। কেবলমাত্র ডকস বলে যে এটি প্রয়োগ করা হয়েছে তার অর্থ এই নয় যে এটি বাস্তবায়িত হয়েছে। আমি তাড়াতাড়ি যে কোনও সময় এটি ব্যবহার করতে যাচ্ছি না।
jamess

0

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

function promiseNoReallyAll (promises) {
  return new Promise(
    async (resolve, reject) => {
      const failedPromises = []

      const successfulPromises = await Promise.all(
        promises.map(
          promise => promise.catch(error => {
            failedPromises.push(error)
          })
        )
      )

      if (failedPromises.length) {
        reject(failedPromises)
      } else {
        resolve(successfulPromises)
      }
    }
  )
}

0

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

async function resetCache(ip) {

    try {

        const response = await axios.get(`http://${ip}/resetcache`);
        return response;

    }catch (e) {

        return {status: 'failure', reason: 'e.message'};
    }

}

0

এটি সিঙ্ক না করে এটি করার জন্য আমি একটি উপায় (workaround) পেয়েছি।

আগে যেমনটি উল্লেখ করা হয়েছিল Promise.allতেমন কিছুই নেই।

সুতরাং ... সমাধান এবং দৃ force়তা প্রয়োগ করার জন্য একটি বদ্ধ প্রতিশ্রুতি ব্যবহার করুন।


      let safePromises = originalPrmises.map((imageObject) => {
            return new Promise((resolve) => {
              // Do something error friendly
              promise.then(_res => resolve(res)).catch(_err => resolve(err))
            })
        })
    })

    // safe
    return Promise.all(safePromises)

0

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

try {
  let resArray = await Promise.all(
    state.routes.map(route => route.handler.promiseHandler().catch(e => e))
  );

  // in catch(e => e) you can transform your error to a type or object
  // that makes it easier for you to identify whats an error in resArray
  // e.g. if you expect your err objects to have e.type, you can filter
  // all errors in the array eg
  // let errResponse = resArray.filter(d => d && d.type === '<expected type>')
  // let notNullResponse = resArray.filter(d => d)

  } catch (err) {
    // code related errors
  }

0

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

আপনি যদি গ্রাফকিউএল ব্যবহার করেন তবে আপনার প্রতিক্রিয়া নির্বিশেষে পোস্টপ্রসেস করতে হবে এবং যদি এটি সঠিক রেফারেন্স না খুঁজে পায় তবে অ্যাপটি ক্র্যাশ করবে, সমস্যাটি যেখানে সংকুচিত হচ্ছে সেখানে সংকুচিত করুন ing

const results = await Promise.all([
  this.props.client.query({
    query: GET_SPECIAL_DATES,
  }),
  this.props.client.query({
    query: GET_SPECIAL_DATE_TYPES,
  }),
  this.props.client.query({
    query: GET_ORDER_DATES,
  }),
]).catch(e=>console.log(e,"error"));
const specialDates = results[0].data.specialDates;
const specialDateTypes = results[1].data.specialDateTypes;
const orderDates = results[2].data.orders;

-1

এভাবেই Promise.allকাজ করার জন্য ডিজাইন করা হয়েছে। যদি একক প্রতিশ্রুতি দেয় reject()তবে পুরো পদ্ধতিটি অবিলম্বে ব্যর্থ হয়।

এমন ব্যবহারের কেস রয়েছে যেখানে Promise.allপ্রতিশ্রুতি ব্যর্থ হওয়ার জন্য কারও কাছে অনুমতি থাকতে পারে। এটি ঘটতে, কেবল reject()আপনার প্রতিশ্রুতিতে কোনও বিবৃতি ব্যবহার করবেন না । তবে কোনও একক অন্তর্নিহিত প্রতিশ্রুতি কখনও সাড়া না পেলে আপনার অ্যাপ / স্ক্রিপ্ট হিমায়িত না হয় তা নিশ্চিত করার জন্য আপনাকে এটিতে একটি সময়সীমা বেঁধে দেওয়া উচিত।

function getThing(uid,branch){
    return new Promise(function (resolve, reject) {
        xhr.get().then(function(res) {
            if (res) {
                resolve(res);
            } 
            else {
                resolve(null);
            }
            setTimeout(function(){reject('timeout')},10000)
        }).catch(function(error) {
            resolve(null);
        });
    });
}


reject()আপনার প্রতিশ্রুতি ব্যবহার না করা ভাল, কিন্তু আপনি যদি অন্য লাইব্রেরির প্রতিশ্রুতি ব্যবহার করা প্রয়োজন?
ড্যান ড্যাসকলেসকু

-8

এই সমস্যাটি আরও সুন্দরভাবে মোকাবেলা করার জন্য আমি একটি এনএমপি লাইব্রেরি লিখেছি। https://github.com/wenshin/promiseallend

ইনস্টল করুন

npm i --save promiseallend

2017-02-25 নতুন এপিআই, এটি প্রতিশ্রুতির নীতিগুলি ভঙ্গ করে না

const promiseAllEnd = require('promiseallend');

const promises = [Promise.resolve(1), Promise.reject('error'), Promise.resolve(2)];
const promisesObj = {k1: Promise.resolve(1), k2: Promise.reject('error'), k3: Promise.resolve(2)};

// input promises with array
promiseAllEnd(promises, {
    unhandledRejection(error, index) {
        // error is the original error which is 'error'.
        // index is the index of array, it's a number.
        console.log(error, index);
    }
})
    // will call, data is `[1, undefined, 2]`
    .then(data => console.log(data))
    // won't call
    .catch(error => console.log(error.detail))

// input promises with object
promiseAllEnd(promisesObj, {
    unhandledRejection(error, prop) {
        // error is the original error.
        // key is the property of object.
        console.log(error, prop);
    }
})
    // will call, data is `{k1: 1, k3: 2}`
    .then(data => console.log(data))
    // won't call
    .catch(error => console.log(error.detail))

// the same to `Promise.all`
promiseAllEnd(promises, {requireConfig: true})
    // will call, `error.detail` is 'error', `error.key` is number 1.
    .catch(error => console.log(error.detail))

// requireConfig is Array
promiseAllEnd(promises, {requireConfig: [false, true, false]})
    // won't call
    .then(data => console.log(data))
    // will call, `error.detail` is 'error', `error.key` is number 1.
    .catch(error => console.log(error.detail))

// requireConfig is Array
promiseAllEnd(promises, {requireConfig: [true, false, false]})
    // will call, data is `[1, undefined, 2]`.
    .then(data => console.log(data))
    // won't call
    .catch(error => console.log(error.detail))

--------------------------------

পুরানো খারাপ এপিআই, এটি ব্যবহার করবেন না!

let promiseAllEnd = require('promiseallend');

// input promises with array
promiseAllEnd([Promise.resolve(1), Promise.reject('error'), Promise.resolve(2)])
    .then(data => console.log(data)) // [1, undefined, 2]
    .catch(error => console.log(error.errorsByKey)) // {1: 'error'}

// input promises with object
promiseAllEnd({k1: Promise.resolve(1), k2: Promise.reject('error'), k3: Promise.resolve(2)})
    .then(data => console.log(data)) // {k1: 1, k3: 2}
    .catch(error => console.log(error.errorsByKey)) // {k2: 'error'}

এটা কিভাবে কাজ করে? দয়া করে আপনার কার্যকারিতাটি কার্যকর করুন এবং ব্যাখ্যা করুন।
বার্গি

আমি একটি নতুন যুগ্ম যুক্তি মত লিখেছে Promise.all। তবে এটি প্রতিশ্রুতির সমস্ত ডেটা এবং ত্রুটি সংগ্রহ করবে। এছাড়াও এটি অবজেক্ট ইনপুটকে সমর্থন করে, এটি বিন্দু নয়। সমস্ত ডেটা এবং ত্রুটিগুলি সংগ্রহ করার পরে, আমি promise.thenনিবন্ধিত কলব্যাকগুলির সাথে মোকাবিলা করার পদ্ধতিটি ওভাররাইড করি যা প্রত্যাখ্যান ও পরিপূর্ণ অন্তর্ভুক্ত। বিশদ জন্য আপনি কোড
wenshin

আহ, এই কোডটি উভয় onFulfilledএবং onRejectedহ্যান্ডলারগুলিকে কল করবে যেটি পাস হয়েছে then?
বার্গি

হ্যাঁ, কেবল যখন প্রতিশ্রুতি স্থিতি মিক্স fulfilledএবং rejected। কিন্তু সত্যিই এটি একটি কঠিন সমস্যা স্বাভাবিকভাবে সব প্রতিশ্রুতি ব্যবহারের ক্ষেত্রে সঙ্গে সামঞ্জস্যপূর্ণ হতে, মত হতে onFulfilledএবং onRejectedসব রিটার্ন Promise.reject()বা Promise.resolve()। এখন পর্যন্ত আমি কীভাবে এটি সমাধান করব তা পরিষ্কার নয়, কারও কি আরও ভাল ধারণা আছে? এখনকার সমস্যার সর্বোত্তম উত্তর হ'ল এটি ব্রাউজারের পরিবেশে ডেটা এবং ত্রুটিগুলি ফিল্টার করতে পারে না।
wenshin

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