2015-12-18 14 views
14

के भीतर सिंक्रोनस कार्यों को कॉल करना मैं वर्तमान में वादे के साथ प्रयोग कर रहा हूं और वास्तव में एक बुनियादी सवाल है!ईएस 6 वादे - वादे श्रृंखला

एक वादे श्रृंखला के भीतर, क्या यह एक सिंक्रोनस फ़ंक्शन को कॉल करने का बुरा अभ्यास होगा? उदाहरण के लिए:

.then(function(results) { 

    if(checkIfResultInMemory(results) === true){ 
     return getTotalFromMemory() 
    } 

    return results; 

    }) 

या मेरे सिंक कार्यों को भी वादे वापस करने के लिए दोबारा प्रतिक्रिया दी जानी चाहिए?

+0

संभावित डुप्लिकेट फेंक [जब एक बनाने के लिए वादा का उपयोग कर एसिंक्रोनस फ़ंक्शन] (http://stackoverflow.com/q/28993673/1048572) – Bergi

+0

सिंक्रोनस फ़ंक्शंस के लिए कभी भी वादे का उपयोग न करें। – Bergi

उत्तर

26

एक वादे श्रृंखला के भीतर, क्या यह एक सिंक्रोनस फ़ंक्शन को कॉल करने का बुरा अभ्यास होगा?

नहीं, यह बिल्कुल बुरा अभ्यास नहीं है। यह कई उम्मीदवारों और उपयोगी प्रथाओं में से एक है।

आप वादे श्रृंखला (.then() हैंडलरों के भीतर) या असीमित कार्यों के बाद सिंक्रोनस फ़ंक्शंस को कॉल करने के लिए पूरी तरह से स्वतंत्र हैं जो फिर एक नया वादा वापस कर देते हैं।

जब आप .then() हैंडलर से कुछ वापस लौटते हैं, तो आप या तो एक मूल्य (जो माता-पिता के वादे का हल मूल्य बन जाता है) वापस कर सकते हैं या आप एक और वादा वापस कर सकते हैं (जो पिछले वादे पर चेन) या आप जो काम कर सकते हैं एक अस्वीकार वादा लौटने की तरह (वादा श्रृंखला अस्वीकार कर दिया जाता है)।

तो, इसका मतलब है कि आप एक सिंक्रोनस फ़ंक्शन को कॉल कर सकते हैं और इससे मूल्य प्राप्त कर सकते हैं या एसिंक फ़ंक्शन को कॉल कर सकते हैं और एक और वादा प्राप्त कर सकते हैं और फिर .then() हैंडलर से वापस लौटा सकते हैं।

इन सभी समकालिक चीजें पूरी तरह से कानूनी हैं और प्रत्येक का अपना उद्देश्य है। यहाँ .then() हैंडलर में कुछ तुल्यकालिक घटनाओं हैं:

function delay(t, val) { 
 
    return new Promise(function(resolve) { 
 
     setTimeout(function() { 
 
      resolve(val); 
 
     }, t); 
 
    }); 
 
} 
 

 
function increment5(val) { 
 
    return val + 5; 
 
} 
 

 
delay(500, 10).then(increment5).then(function(val) { 
 
    return val - 3; 
 
}).then(function(final) { 
 
    document.write(final); 
 
});
:

// modify resolved value 
someAsync().then(function(val) { 
    return val + 12; 
}); 

// modify resolved value by calling some synchronous function to process it 
someAsync().then(function(val) { 
    return someSynchronousFunction(val); 
}); 

// synchronously check the value and throw to change the promise chain 
// to rejected 
someAsync().then(function(val) { 
    if (val < 0) { 
     throw new Error("value can't be less than zero"); 
    } 
    return val; 
}); 

// synchronously check the value and return a rejected promise 
// to change the promise chain to rejected 
someAsync().then(function(val) { 
    if (val < 0) { 
     return Promise.reject("value can't be less than zero"); 
    } 
    return val; 
}); 

यहाँ एक async आपरेशन कि एक वादा तीन तुल्यकालिक .then() संचालकों द्वारा पीछा देता है और फिर अंतिम मूल्य outputting का एक छोटा उदाहरण है

नोट: आप केवल आम तौर पर केवल चाहते हैं वादे का उपयोग करने के लिए जब आपके पास एसिंक्रोनस ऑपरेशंस हो या हो सकता है क्योंकि यदि सब कुछ तुल्यकालिक है, तो शुद्ध सिंक्रोनस कोड निष्पादित करने और लिखने में आसान दोनों तेज़ है। लेकिन, यदि आपके पास पहले से कम से कम एक एसिंक ऑपरेशन है, तो आप निश्चित रूप से उस एसिंक ऑपरेशन के साथ सिंक्रोनस ऑपरेशंस को मिश्रित कर सकते हैं और कोड की संरचना में सहायता के लिए वादे का उपयोग कर सकते हैं।

+0

बहुत धन्यवाद @ jfriend00 - वास्तव में बहुत मददगार! आपके समय के लिए धन्यवाद। – Ben

+1

डाउनवोट क्यों? बिना किसी टिप्पणी के एक आम तौर पर स्वीकृत उत्तर के डाउनवॉट्स जो बताते हैं कि आपको लगता है कि यह एक डाउनवोट के योग्य क्यों है, वास्तव में समुदाय में बहुत योगदान नहीं देता है। यदि आप समझाते हैं, तो लेखक आपके मुद्दे को हल करने और सभी के लिए उत्तर सुधारने के लिए अपना उत्तर सुधार सकता है। ड्राइवबी डाउनवॉटिंग समुदाय के बाकी हिस्सों में चीजों को बेहतर बनाने में मदद नहीं करता है। – jfriend00

+0

उत्कृष्ट जवाब। पौराणिक "सिंक्रोनस वादे कभी नहीं करते" से काफी बेहतर है। धन्यवाद। – Kim

2

एक then कॉलबैक फ़ंक्शन चाहिए:

  • वापसी एक और वादा
  • वापसी एक तुल्यकालिक मूल्य (या अपरिभाषित)
  • एक तुल्यकालिक त्रुटि के
+0

"वादा के अंदर", मुझे लगता है कि आप "एक 'के अंदर' हैंडलर" का मतलब है? –

+0

हाँ, मुझे इसे ठीक करने दें: डी – trquoccuong

+0

मुझे समझ में नहीं आता कि आपका क्या मतलब है। विशिष्ट भाग कोड। – Internial

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