একটি অপরিবর্তিত প্রতিশ্রুতি প্রত্যাখ্যান কি?


203

কৌনিক 2 শেখার জন্য, আমি তাদের টিউটোরিয়াল চেষ্টা করছি trying

আমি এর মতো একটি ত্রুটি পাচ্ছি:

(node:4796) UnhandledPromiseRejectionWarning: Unhandled promise rejection (r                                                                                                     ejection id: 1): Error: spawn cmd ENOENT
[1] (node:4796) DeprecationWarning: Unhandled promise rejections are deprecated.
In the future, promise rejections that are not handled will terminate the Node.
js process with a non-zero exit code.

আমি এসও-তে বিভিন্ন প্রশ্ন এবং উত্তর দিয়েছি তবে "আনহানডেলড প্রতিশ্রুতি প্রত্যাখ্যান" কী তা খুঁজে পেলাম না।

Error: spawn cmd ENOENTএই সতর্কতা থেকে পরিত্রাণ পেতে যখন কেউ উত্থাপিত হয় এবং আমাকে কী পরীক্ষা করতে হয় তা কী কী আমাকে সহজে ব্যাখ্যা করতে পারে ?


2
আমি এই প্রশ্ন মিস! এই সতর্কবাণীটি বিভ্রান্তিকর হওয়ার জন্য আমি খুব দুঃখিত - আমরা এটি আরও নতুন নোড.জেজে উন্নত করেছি এবং আমরা শীঘ্রই পুরো জিনিসটিকে আরও ভাল করে দিচ্ছি!
বেনিয়ামিন গ্রুইনবাউম


@ বেনজামিন গ্রুয়েনবাউম, এটি এখনও স্থির? আমি নোড v12.16.1 এ একই ত্রুটি পেয়েছি
বেবি

1
@ বেবিডেস্তা ভাল, আমরা এখন একটি স্ট্যাক ট্রেস দিয়ে আরও ভাল ত্রুটি দেখাই কিন্তু আমরা এখনও অব্যাহত প্রত্যাখ্যানগুলিতে নোড ক্রাশ করি না। এটি করার জন্য আমাদের সম্ভবত একটি পিআর খুলতে হবে।
বেনিয়ামিন গ্রুইনবাউম

উত্তর:


200

এই ত্রুটির উত্থান এই সত্যের মধ্যেই রয়েছে যে প্রতিটা প্রতিশ্রুতি প্রতিশ্রুতি প্রত্যাখ্যানকে হ্যান্ডেল করার অর্থাত্ একটি .ক্যাচ (...) রয়েছে । আপনি নীচে বর্ণিত কোডের প্রতিশ্রুতিতে .ক্যাচ (...) যুক্ত করে এড়াতে পারবেন ।

উদাহরণস্বরূপ, PTest () ফাংশনটি বিশ্বব্যাপী ভেরিয়েবল সামোভারের মানের ভিত্তিতে একটি প্রতিশ্রুতি সমাধান করবে বা প্রত্যাখ্যান করবে

var somevar = false;
var PTest = function () {
    return new Promise(function (resolve, reject) {
        if (somevar === true)
            resolve();
        else
            reject();
    });
}
var myfunc = PTest();
myfunc.then(function () {
     console.log("Promise Resolved");
}).catch(function () {
     console.log("Promise Rejected");
});

কিছু ক্ষেত্রে, আমাদের কাছে প্রতিশ্রুতিগুলির জন্য .catch (..) লেখা থাকলেও " অপরিশোধিত প্রতিশ্রুতি প্রত্যাখ্যান" বার্তা আসে। আপনি কীভাবে আপনার কোডটি লেখেন সে সম্পর্কে এটি সবই। নীচের কোডটি " হ্যান্ডেলড প্রতিশ্রুতি প্রত্যাখ্যান" উত্পন্ন করবে যদিও আমরা পরিচালনা করছি catch

var somevar = false;
var PTest = function () {
    return new Promise(function (resolve, reject) {
        if (somevar === true)
            resolve();
        else
            reject();
    });
}
var myfunc = PTest();
myfunc.then(function () {
     console.log("Promise Resolved");
});
// See the Difference here
myfunc.catch(function () {
     console.log("Promise Rejected");
});

পার্থক্য হ'ল আপনি .catch(...)চেইন হিসাবে পৃথক হিসাবে পরিচালনা করবেন না । কোনও কারণে জাভাস্ক্রিপ্ট ইঞ্জিনটি আন-হ্যান্ডেল প্রতিশ্রুতি প্রত্যাখ্যান ছাড়াই এটি প্রতিশ্রুতি হিসাবে বিবেচনা করে।


4
মনে হয় এটি কাজ করে, যদি আপনি myFunc = myFunct.then...দ্বিতীয় উদাহরণটি যুক্ত করেন।
আইনস্টাইন

@ আইনস্টাইনে এটি প্রদর্শিত হবে কারণ আপনি প্রথম উদাহরণের মতো একই চেইনটি পুনরায় তৈরি করছেন:var x = foo(); x = x.then(...); x = x.catch(...)
র্যান্ডমসক

4
@ আইনস্টাইন আপনার অপ্রত্যাশিত উদাহরণে, যখন আপনি "কোনও কারণে জাভা স্ক্রিপ্ট ইঞ্জিনটি হ্যান্ড হ্যান্ডলড প্রতিশ্রুতি প্রত্যাখ্যান ব্যতীত প্রতিশ্রুতি হিসাবে বিবেচনা করেন" বলে থাকেন, তবে এটি .then(() => {...})কি তাই নয় যেটি আপনি পরিচালনা করছেন না তাতে ব্যতিক্রম ছুঁড়ে দেওয়া যেতে পারে ? আপনি যখন শৃঙ্খলাবদ্ধ তখন এটি একই কাজ করছে বলে আমি মনে করি না। তাই কি?
সাইমন লেগ

8
@ ডি কেজি আপনার দ্বিতীয় পয়েন্ট সম্পর্কিত, catchএটি একটি সিনট্যাক্স চিনির জন্য then(undefined, onRejected)। যেহেতু আপনি ইতিমধ্যে মাইফাঙ্কে কল করেছেন এবং এটি একটি ত্রুটি ঘটায়, তাই আবার একই প্রতিশ্রুতিতে কল করা যাচ্ছে না (অপরিজ্ঞাত, অনারেক্টেড)।
কেভিন লি

1
কোথায় বদলাবেন? আমি আয়নিক 3 ব্যবহার করছি যখন আমি আয়নিক কর্ডোভা বিল্ড অ্যান্ডরিড কমান্ডটি আঘাত করি তখন আমাকে এই ত্রুটিটি দেয়।
সাগর কোডে

34

এটি তখন যখন কোনও কার্যকর Promiseহয় .reject()বা কোনও ব্যতিক্রম asyncকার্যকর কার্যকর কোডে ফেলে দেওয়া হয় এবং কোনটি .catch()প্রত্যাখ্যানকে পরিচালনা করে না।

প্রত্যাখ্যাত প্রতিশ্রুতি এমন একটি ব্যতিক্রমের মতো যা অ্যাপ্লিকেশন এন্ট্রি পয়েন্টের দিকে বুদবুদ হয়ে যায় এবং রুট ত্রুটি হ্যান্ডলারকে সেই আউটপুট উত্পাদন করে তোলে।

আরো দেখুন


কোথায় বদলাবেন? আমি আয়নিক 3 ব্যবহার করছি যখন আমি আয়নিক কর্ডোভা বিল্ড অ্যান্ডরিড কমান্ডটি আঘাত করি তখন আমাকে এই ত্রুটিটি দেয়।
সাগর কোডে

এই তথ্য দিয়ে বলা শক্ত। আমি আপনাকে ন্যূনতম প্রজনন তৈরি করার চেষ্টা করার এবং আপনার নির্দিষ্ট পরিস্থিতির জন্য একটি নতুন প্রশ্ন তৈরি করার পরামর্শ দিচ্ছি।
গন্টার জ্যাচবাউয়ার

আমি এর জন্য অনুগ্রহ খুলেছি। দয়া করে দেখুন এ stackoverflow.com/q/48145380/5383669
সাগর Kodte

22

প্রতিশ্রুতিগুলি প্রত্যাখ্যান হওয়ার পরে "পরিচালনা করা" যেতে পারে। অর্থাত্, একজন ক্যাচ হ্যান্ডলার সরবরাহ করার আগে কোনও প্রতিশ্রুতি বাতিল হওয়া কলব্যাক কল করতে পারে। এই আচরণটি আমার কাছে কিছুটা বিরক্তিকর কারণ কেউ লিখতে পারে ...

var promise = new Promise(function(resolve) {
kjjdjf(); // this function does not exist });

... এবং এই ক্ষেত্রে, প্রতিশ্রুতি নীরবে প্রত্যাখ্যান করা হয়। যদি কেউ একজন ক্যাচ হ্যান্ডলার যুক্ত করতে ভুলে যায় তবে কোডটি ত্রুটি ছাড়াই নিঃশব্দে চলতে থাকবে। এটি দীর্ঘায়িত এবং হার্ড-টু-বাগ খুঁজে পেতে পারে।

নোড.জেজেসের ক্ষেত্রে, এই নিরবচ্ছিন্ন প্রতিশ্রুতি প্রত্যাখ্যানগুলি পরিচালনা করার এবং সমস্যাগুলির প্রতিবেদন করার কথা রয়েছে। এটি আমাকে ES7 async / অপেক্ষায় নিয়ে আসে। এই উদাহরণ বিবেচনা করুন:

async function getReadyForBed() {
  let teethPromise = brushTeeth();
  let tempPromise = getRoomTemperature();

  // Change clothes based on room temperature
  let temp = await tempPromise;
  // Assume `changeClothes` also returns a Promise
  if(temp > 20) {
    await changeClothes("warm");
  } else {
    await changeClothes("cold");
  }

  await teethPromise;
}

উপরের উদাহরণে, ধরুন দাঁতপ্রসেস প্রত্যাখ্যান করা হয়েছিল (ত্রুটি: টুথপেস্টের বাইরে!) GetRoomTemperature সম্পন্ন হওয়ার আগে। এই ক্ষেত্রে, দাঁতপ্রোমিজের অপেক্ষা না করা অবধি অবধি বিহীন প্রতিশ্রুতি প্রত্যাখ্যান হবে।

আমার বক্তব্যটি হ'ল ... আমরা যদি অপরিবর্তিত প্রতিশ্রুতি প্রত্যাখ্যানকে একটি সমস্যা হিসাবে বিবেচনা করি তবে প্রতিশ্রুতিগুলি পরে অপেক্ষার মাধ্যমে পরিচালিত হয় তা অজান্তে বাগ হিসাবে প্রকাশিত হতে পারে। আবার আমরা যদি সমস্যাহীন না হয়ে প্রতিশ্রুতিবদ্ধ প্রত্যাখ্যানগুলি বিবেচনা করি তবে বৈধ বাগগুলি প্রতিবেদন নাও পেতে পারে।

এ নিয়ে ভাবনা?

এটি এখানে নোড.জেএস প্রকল্পে আলোচনার সাথে সম্পর্কিত:

ডিফল্ট আনহানডেলড প্রত্যাখ্যান সনাক্তকরণ আচরণ

আপনি যদি কোডটি এভাবে লিখেন:

function getReadyForBed() {
  let teethPromise = brushTeeth();
  let tempPromise = getRoomTemperature();

  // Change clothes based on room temperature
  return Promise.resolve(tempPromise)
    .then(temp => {
      // Assume `changeClothes` also returns a Promise
      if (temp > 20) {
        return Promise.resolve(changeClothes("warm"));
      } else {
        return Promise.resolve(changeClothes("cold"));
      }
    })
    .then(teethPromise)
    .then(Promise.resolve()); // since the async function returns nothing, ensure it's a resolved promise for `undefined`, unless it's previously rejected
}

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

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

এই ক্ষতি এড়াতে দয়া করে কোডটি এইভাবে লিখুন:

async function getReadyForBed() {
  let teethPromise = brushTeeth();
  let tempPromise = getRoomTemperature();

  // Change clothes based on room temperature
  var clothesPromise = tempPromise.then(function(temp) {
    // Assume `changeClothes` also returns a Promise
    if(temp > 20) {
      return changeClothes("warm");
    } else {
      return changeClothes("cold");
    }
  });
  /* Note that clothesPromise resolves to the result of `changeClothes`
     due to Promise "chaining" magic. */

  // Combine promises and await them both
  await Promise.all(teethPromise, clothesPromise);
}

মনে রাখবেন যে এটি কোনও অনিচ্ছাকৃত প্রতিশ্রুতি প্রত্যাখ্যান করা উচিত should


13

"অবমানন সতর্কতা : অব্যর্থহিত প্রতিশ্রুতি প্রত্যাখ্যান করা হয়"

TLDR: একটি অঙ্গীকার রয়েছে resolveএবং rejectএকটি করছেন rejectহ্যান্ডেল করতে এটা নিন্দা করা হয়েছে, যাতে আপনাকে অন্তত একটি আছে থাকবে একটি ধরা ছাড়া catchশীর্ষ স্তরে।


2

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


1

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

নোডজেগুলিতে প্রত্যাখ্যান হ্যান্ডলারটিকে অবহেলা করা হয়। আপনার ত্রুটিটি কেবল একটি সতর্কতা এবং আমি এটিকে node.js গিথুব এর ভিতরে পড়েছি। আমি এটি খুঁজে পেয়েছি।

DEP0018: হাতছাড়া হওয়া প্রতিশ্রুতি প্রত্যাখ্যান

প্রকার: রানটাইম

অপরিবর্তিত প্রতিশ্রুতি প্রত্যাখ্যান করা হয়। ভবিষ্যতে, প্রতিশ্রুতি প্রত্যাখ্যানগুলি যা পরিচালনা করা হয় না তা নোড.জেএস প্রক্রিয়াটি শূন্য-বহির্গমন প্রস্থান কোড দিয়ে শেষ করবে।

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