कैसे उपयोग करने के लिए वादा।

Nov 20 2020

टाइपस्क्रिप्ट बिल्ड विफल हो रहा है क्योंकि ऐसा प्रतीत नहीं होता है, Promise.allSetttledभले ही मैंने ts कॉन्फिग कॉम्पीलेरेशंस सेट किए हों"lib": [ "ES2020.Promise" ],

ऐसा लगता है जैसे प्रतिक्रिया के लिए promise.allSettledशामिल नहीं है resultया reason

टाइपस्क्रिप्ट बिल्ड बनाते समय मुझे निम्न त्रुटि मिलती है:

Property 'reason' does not exist on type 'PromiseSettledResult<IMyPromiseResult>'.

तथा

Property 'value' does not exist on type 'PromiseRejectedResult'.

मेरे कोड ब्लॉक इस तरह दिखता है और जैसा कि आप देख सकते हैं, मैं का उपयोग करने की कोशिश कर रहा हूँ reasonऔर resultवादों कि हल की eaech से।

const myPromise = async () : Promise<IMyPromiseResult> {
  return new Promise((resolve) => {
    resolve("hello world")
  })
}

const data = await Promise.allSettled([
  myPromise()
]);

const response = data.find(res => res.status === 'fulfilled')?.result;

if(!response) {
  const error = data.find(res => res.status === 'rejected')?.reason;
  throw new Error(error);
}

मैं सही इंटरफेस को शामिल करने के लिए Promise.allSettled घोषणा को कैसे अपडेट कर सकता हूं?

जवाब

2 Jens Nov 20 2020 at 11:46

जैसे बर्गी ने उल्लेख किया है कि टाइपस्क्रिप्ट पता नहीं है कि क्या प्रकार है PromiseFulfilledResult/ PromiseRejectedResultजब जाँच प्रकार।

एक ही तरीका है कि आप वादे को पूरा करें। यह किया जा सकता है क्योंकि आपने पहले से ही सत्यापित किया है कि हल किया गया वादा या तो पूरा हो गया है या अस्वीकार कर दिया गया है।

इस उदाहरण को देखें:

const myPromise = async (): Promise<string> => {
  return new Promise((resolve) => {
    resolve("hello world");
  });
};

const data = await Promise.allSettled([myPromise()]);

const response = (data.find(
  (res) => res.status === "fulfilled"
) as PromiseFulfilledResult<string> | undefined)?.value;

if (!response) {
  const error = (data.find(
    (res) => res.status === "rejected"
  ) as PromiseRejectedResult | undefined)?.reason;
  throw new Error(error);
}
2 bela53 Nov 20 2020 at 13:13

findकॉलबैक को टाइप गार्ड के रूप में परिभाषित करें , जो एक प्रकार की भविष्यवाणी लौटाता है:

type IMyPromiseResult = string

const response = data.find(
  (res): res is PromiseFulfilledResult<string> => res.status === 'fulfilled'
)?.value;

if (!response) {
  const error = data.find(
    (res): res is PromiseRejectedResult => res.status === 'rejected'
  )?.reason;
  throw new Error(error);
}

डेमो खेल का मैदान