वादों के साथ, क्या reject के उपयोग को छोड़ना गलत व्यवहार है? अगर मैं यह सुनिश्चित करने के लिए केवल एक वादा वापस करना चाहता हूं कि यह फ़ंक्शन पूरी तरह से चलता है और इस फ़ंक्शन का पालन करने वाले किसी भी चीज़ को अवरुद्ध नहीं करता है।

function testFunc() {
     return new Promise((resolve,reject) => {
            // do stuff
            resolve(true);
     })
}

testfunc().then(() => { // additional stuff});
2
LegoGeo 12 पद 2020, 08:00

2 जवाब

सबसे बढ़िया उत्तर

यदि do stuff द्वारा कोई त्रुटि होने की संभावना है, तो आपको चाहिए reject का उपयोग करना सुनिश्चित करना चाहिए और कोई त्रुटि होने पर उसे कॉल करना चाहिए, ताकि कॉल करने वाला देख सके कि कोई समस्या थी और (उम्मीद है) इसे उचित रूप से संभाल लें। उदाहरण के लिए, आप ऐसा नहीं करना चाहेंगे:

function testFunc() {
     return new Promise((resolve,reject) => {
            getApi((error, result) => {
                resolve(result);
            });
     });
}

लेकिन इसके बजाय

function testFunc() {
     return new Promise((resolve,reject) => {
            getApi((error, result) => {
                if (error) reject(error);
                resolve(result);
            });
     });
}

यदि वास्तव में फ़ंक्शन की सामग्री के त्रुटिपूर्ण होने का कोई मौका नहीं है (तर्क बग को छोड़कर जो अनजाने में किसी भी कोड में मौजूद हो सकते हैं), तो reject आपकी मदद नहीं करेगा, क्योंकि आपके पास वास्तव में रखने के लिए उपयुक्त कोई जगह नहीं है यह। उदाहरण के लिए:

function someWeirdPromiseFunctionThatBlocks() {
     return new Promise((resolve) => {
         for (let i = 0; i < 1e5; i++) {
         }
         resolve();
     });
}

ध्यान दें कि यदि आप बस चाहते हैं:

इस फ़ंक्शन का अनुसरण करने वाले किसी भी चीज़ को ब्लॉक न करें।

फिर केवल एक वादा वापस करने से वह पूरा नहीं होगा, क्योंकि प्रॉमिस कंस्ट्रक्टर अपने सभी कोड सिंक्रोनस रूप से चलाएगा जब तक कि यह कुछ एसिंक्रोनस (जैसे getApi) का सामना न करे। नीचे दिए गए सिंक कोड के चलने को अवरुद्ध करने से बचने के लिए, Promise.resolve या setTimeout का उपयोग करें, जैसे:

function testFunc() {
    return Promise.resolve()
        .then(() => {
            // do other stuff
        });
1
CertainPerformance 12 पद 2020, 08:10

नहीं, यह बिल्कुल जरूरी नहीं है। अस्वीकार का मतलब उसी तरह से इस्तेमाल किया जाना है जैसे कोई throw का उपयोग कर सकता है - यह होने वाली त्रुटियों के लिए है।

वास्तव में, यदि आप जावास्क्रिप्ट के async/प्रतीक्षा सिंटैक्स से परिचित हैं, तो यह async फ़ंक्शन...

async function doSomething() {
  throw new Error('Oh no!')
}

... मोटे तौर पर इसका अनुवाद करता है:

function doSomething() {
  return Promise.reject(new Error('Oh no!'))
}

जो दिखाता है कि जहां भी आप सामान्य रूप से कोई त्रुटि फेंक सकते हैं, वहां अस्वीकार करने का इरादा कैसे किया जाता है।

यहां एक उदाहरण वादा है जिसका मैं अक्सर उपयोग करता हूं जहां कोई "अस्वीकार" नहीं होता है जो समझ में आता है:

const wait = ms => new Promise(resolve => setTimeout(resolve, ms))

wait(1000).then(() => console.log('done'))

ऐसे कई अन्य उदाहरण मौजूद हैं।

0
Scotty Jamison 12 पद 2020, 08:07