2017-09-27 32 views
5

के साथ वादा करता है मैं मोंगोस वादे का उपयोग करने की लटक पाने की कोशिश कर रहा हूं, जो कि node.js. की एसिंक/प्रतीक्षा कार्यक्षमता के साथ वादे करता है। जब मेरा फ़ंक्शन printEmployees कहा जाता है, तो मैं orderEmployees फ़ंक्शन द्वारा पूछे जाने वाले कर्मचारियों की सूची को सहेजना चाहता हूं। orderEmployees के अंदर console.log कथन अपेक्षित क्वेरी देता है, console.logprintEmployees के अंदर undefined देता है, यह सुझाव देता है कि मैं सही तरीके से वादा वापस नहीं कर रहा हूं।mynoose का उपयोग async/await

मैं पूरी तरह से संभव वादे के लिए नया हूं कि मैं प्रतिमान को सही ढंग से समझ नहीं रहा हूं ... किसी भी मदद की बहुत सराहना की जाती है।

printEmployees: async(company) => { 
    var employees = await self.orderEmployees(company); 
    // SECOND CONSOLE.LOG 
    console.log(employees); 
    }, 

    orderEmployees: (companyID) => { 
    User.find({company:companyID}) 
    .exec() 
    .then((employees) => { 
     // FIRST CONSOLE.LOG 
     console.log(employees); 
     return employees; 
    }) 
    .catch((err) => { 
     return 'error occured'; 
    }); 
    }, 

उत्तर

3

आप अपने Promisereturn करने की जरूरत है, अन्यथा आप await एक समारोह है कि अनिवार्य रूप से कुछ भी नहीं/undefined रिटर्न पर ing हैं।

orderEmployees: (companyID) => { 
    return User.find({ company:companyID }).exec() 
} 
2

आप वापस जाने के लिए जरूरत है एक PromiseorderEmployees

orderEmployees: companyId => User.find({ companyId }).exec() 

आप कुछ त्रुटि हैंडलिंग या पूर्व प्रसंस्करण करना है के रूप में इससे पहले कि आप तो लौट आप अपने कोड रख सकते लेकिन सिर्फ वापस जाने के लिए याद चाहते हैं से परिणाम (वादे श्रृंखला योग्य हैं)।

+0

मैं नहीं देखता कि [स्पष्ट वादा निर्माण antipattern] (https://stackoverflow.com/questions/23803743/what-is-the-explicit-promise-construction-antipattern-and-how-do-i-avoid -it) त्रुटि प्रबंधन से मदद मिलेगी। क्या फायदा है आप बस एक साधारण async फ़ंक्शन से 'कर्मचारियों को वापस' और 'फेंक'' कर सकते हैं। –

+0

@ टामास हेगेडस हाँ अच्छा बिंदु, पुरानी आदत उन समय से जहां नोड ने अंदरूनी वादों से फेंकने वाले अपवादों को संभाला नहीं था! – James

4

आप आदेश कर्मचारियों से वादा वापस नहीं कर रहे हैं।

printEmployees: async(company) => { 
    var employees = await self.orderEmployees(company); 
    // SECOND CONSOLE.LOG 
    console.log(employees); 
}, 

orderEmployees: (companyID) => { 
    return User.find({company:companyID}) 
.exec() 
.then((employees) => { 
    // FIRST CONSOLE.LOG 
    console.log(employees); 
    return employees; 
}) 
.catch((err) => { 
    return 'error occured'; 
}); 
}, 
6

orderEmployees एसिंक फ़ंक्शन की तरह व्यवहार करने के लिए, आपको परिणामी वादे को वापस करना होगा।

  1. एक समारोह अतुल्यकालिक अगर यह एक Promise
  2. रिटर्न आप एक वादा है, तो (उदाहरण के एक async समारोह से वापस लौटे के लिए) या तो आप कॉल करना होगा .then है: वहाँ दो नियमों async/await खोजशब्दों के बिना जब वादों का उपयोग कर पालन करने के लिए कर रहे हैं उस पर या इसे वापस।

जब आप async/await उपयोग कर रहे हैं तो आप await वादों पर आप प्राप्त करना होगा।

यह कहा गया है कि आप देखेंगे कि आप orderEmployees के अंदर उत्पन्न वादे को वापस नहीं लौटते हैं। ठीक करने में आसान है, लेकिन यह फ़ंक्शन एसिंक को भी फिर से लिखना आसान है।

orderEmployees: (companyID) => { 
    return User.find({company:companyID}) // Notice the return here 
    .exec() 
    .then((employees) => { 
    // FIRST CONSOLE.LOG 
    console.log(employees); 
    return employees; 
    }) 
    .catch((err) => { 
    return 'error occured'; 
    }); 
}, 

या

orderEmployees: async(companyID) => { 
    try { 
    const employees = await User.find({company:companyID}).exec(); 
    console.log(employees); 
    return employees; 
    } catch (err) { 
    return 'error occured'; 
    } 
}, 

पुनश्च: त्रुटि हैंडलिंग कुछ हद तक यहाँ त्रुटिपूर्ण है। हम आमतौर पर किसी फ़ंक्शन से त्रुटि स्ट्रिंग लौटकर त्रुटियों को संभाल नहीं पाते हैं। इस मामले में त्रुटि प्रसारित करना बेहतर है, और इसे कुछ शीर्ष-स्तर, UI कोड से संभाल लें।

संबंधित मुद्दे