DanLevy.net

प्रॉमिस के फंदे

आम गलतियों से बचना

Hero image for प्रॉमिस के फंदे

Promises अन्य मानों की तरह काम नहीं करतीं

आप उनके मान को अधिकांश मानों की तरह प्रिंट नहीं कर सकते:

// This doesn't make sense w/ promises:
console.log(Promise.resolve(42));
// We must use the `.then` interface:
Promise.resolve(42).then(value => console.log(value));

Promises गलती करने पर आपको चेतावनी नहीं देतीं

खैर, यह एक आम गलती है।

कई कारणों से, TC39 ने तय किया कि .then और .catch में null पास किया जा सकता है। उदाहरण के लिए, .then(null, null) वैध है और अपेक्षित व्यवहार यह है कि श्रृंखला में उस ‘स्टेप’ को छोड़ दिया जाए।

इसका दुर्भाग्यपूर्ण परिणाम यह है कि चीज़ें गड़बड़ करना बहुत आसान हो जाता है।

By Example

आइए एक छोटा चुनौती देखें: निम्नलिखित विकल्पों में से कौन‑सा console.log 42 करेगा?

// Option #1:
Promise.resolve(42).then(console.log());
// Option #2:
Promise.resolve(42).then(console.log);
// Option #3:
Promise.resolve(42).then(value => console.log(value));
// Option #4:
Promise.resolve(42)
.then(console.log())
.then(console.log);
The Answer

उत्तर है #2, #3 और #4।

क्यों? चलिए देखते हैं कि .then() को क्या पास किया गया types हैं:

var arg1 = console.log();
var arg2 = console.log;
var arg3 = value => console.log(value);
typeof arg1 === "undefined";
typeof arg2 === "function";
typeof arg3 === "function";

अब भी सोच रहे हैं कि वह चौथा विकल्प कैसे काम करता है?

यह मूलतः इस प्रकार कार्य करता है:

// Option #4 - effectively
Promise.resolve(42)
.then(undefined) // यह मान पर कोई प्रभाव नहीं डालता, यह अगले `.then(fn)` को पास किया जाएगा
.then(console.log);