2016-02-14 29 views
6

को पूरा मैं वादे को समझने के तीन में से एक राज्यों में मौजूद करने के लिए: एक वादा या तो हो सकता है लंबित (अनसुलझे), पूरा (सफलतापूर्वक हल हो) या को अस्वीकार कर दिया (असफल हल हो गई)।जे एस वादे: बनाम हल

A+ Promise Spec और MDN's documentation के माध्यम से पढ़ना, मैं उलझन में हूँ वे दोनों स्वीकार करते हैं कि और को अस्वीकार कर दिया राज्यों को पूरा किया लेकिन वादा निर्माता की परिभाषा में वे दो कॉलबैक निर्दिष्ट करें: संकल्प और अस्वीकार। ऐसा लगता है कि हम इन दोनों शर्तों को एक दूसरे के रूप में उपयोग कर रहे हैं; वो नहीं हैं।

सफलता संकेत नहीं करता है:

re·solve /rəˈzälv/ verb 
1. settle or find a solution to (a problem, dispute, or contentious matter). 

सफलता मतलब है:

ful·fill /fo͝olˈfil/ verb 
1. bring to completion or reality; achieve or realize (something desired, promised, or predicted). 
2. carry out (a task, duty, or role) as required, pledged, or expected. 

क्यों हम संकल्प यहाँ का उपयोग कर रहे हैं जब हम वास्तव में रहे पूरा वादा ing? क्या कोई उदाहरण है जिसमें हम को को हल करते हैं, तो परिणाम एड को अस्वीकार कर सकता है?

+0

देखें http://stackoverflow.com/questions/35042068/why-is-onrejected-not-called-following-promise-all-where-promise-reject-incl – guest271314

+1

यह लिंक प्रासंगिक प्रतीत नहीं होता है। क्या आप विस्तार से समझा सकते हैं? – rrowland

+1

_ "यह मेरे लिए हुआ कि शायद अगर मैं कॉलबैक को हल करने में कोई त्रुटि पास करता हूं, तो यह वादा को अस्वीकार कर देगा।" _ 'वादा' को 'त्रुटि' के साथ मान के रूप में हल किया गया था, 'वादा' अस्वीकार नहीं किया गया था। – guest271314

उत्तर

2

एक संकल्प लिया Promise एक Error के एक मूल्य स्वचालित रूप से अस्वीकार कर दिया Promise

var p = Promise.resolve(new Error("rejected")); 
 
p.then(function(data) { 
 
    console.log(data, p) 
 
})
करने के लिए Promise परिवर्तित नहीं करता


भी देखें States and fates


होने

यदि आप पर इसे हल करने के बजाय वादा को अस्वीकार करने के तरीके के बारे में जानकारी शामिल कर सकते हैं, तो मैं इसे पूर्ण उत्तर पर विचार करूंगा।

नहीं

के लिए कारण या resolve का उपयोग कर एक Promise को अस्वीकार करने के अपेक्षित परिणाम के बारे में कुछ?सरल दृष्टिकोण इस लक्ष्य को हासिल करने के लिए reject एक पैरामीटर के रूप पारित करने के लिए किया जाएगा हालांकि जब resolvePromise.resolve(Promise.reject(/* Error here */))

var _reject = function(err) { 
 
    return Promise.reject(err) 
 
} 
 

 
var resolver = function(resolve, reject) { 
 
    return resolve(_reject(new Error("reject within resolve"))) 
 
} 
 

 
var p = new Promise(resolver); 
 

 
p.then(function(data) { 
 
    console.log("resolved", data) 
 
},function(data) { 
 
    console.log("rejected:", data, "promise:", p) 
 
})

अपेक्षित परिणाम त्रुटियों या एक को अस्वीकार कर दिया Promiseresolve के लिए पारित पकड़ने के लिए है, तो कहा जाता है जहां संचालकों संलग्न किया जा सकता है , "resolved"PromiseStatus को बनाए रखते हुए, unhandledrejection ईवेंट का उपयोग कर सकते हैं, Promise.reject सीधे या क्रोम/क्रोमियम 49+ पर PromiseRejectionEvent

का उपयोग कर सकता है

window.addEventListener("unhandledrejection", function(event) { 
 
    // handle unhandled rejected `Promise` 
 
    console.log("unhandledrejection:", event.reason, event.promise); 
 
}); 
 

 
Promise.resolve(new PromiseRejectionEvent("Error", { 
 
    // unhandled `rejected` `Promise` 
 
    promise: Promise.reject(new Error("custom rejection")), 
 
    reason: "custom rejection" 
 
    })) 
 
    .then(function(data) { 
 
    // `PromiseRejectionEvent` contains a `rejected` 
 
    // `Promise` , which triggers `"unhandledrejection"` event 
 
    // to handle rejected `Promise` here, resolve `.promise` 
 
    // object of `PromiseRejectionEvent` 
 
    console.log("resolved:", data); 
 
    }, function(err) { 
 
    console.log("rejected", err) 
 
})

जो onRejected या catch

new Promise(function(resolve, reject) { 
 
    throw new Error("reject within Promise constructor") 
 
}) 
 
// catch here handles `Error` from `Promise` constructor 
 
// will be `resolved` at `.then()` if `Error` not `throw`n to `.then()` 
 
// .catch(function(e) { 
 
// console.log("caught error:", e); 
 
    /* return e : pass `e` to `.then()` as `resolved` `Promise` */ 
 
    /* throw e : pass `e` to `.then()` as `rejected` `Promise` */ 
 
//}) 
 

 
.then(function(data) { 
 
    console.log("resolved:", data) 
 
}, function(err) { 
 
    console.log("rejected:", err); 
 
    throw err 
 
}) 
 
.catch(function(e) { 
 
    console.log("caught error:", e); 
 
    /* return e : pass `e` to `.then()` as `resolved` `Promise` */ 
 
    /* throw e : pass `e` to `.then()` as `rejected` `Promise` */ 
 
})

द्वारा नियंत्रित किया जाना चाहिए resolve या reject का उपयोग किए बिना throw एक Error भी कर सकते थे Promise निर्माता के भीतर, 0

स्पष्टीकरण: आवेदन और अपेक्षित परिणामों के आधार पर संकल्पित और अस्वीकार Promise ऑब्जेक्ट्स को संभालने के लिए कई दृष्टिकोण हैं।

+0

के संभावित डुप्लिकेट को धीमा कर देता हूं जैसा कि उपरोक्त टिप्पणियों में स्पष्ट किया गया है, यह एक ऐसे प्रश्न को संबोधित कर रहा है जिसे मैंने नहीं पूछा था। मैं इस उदाहरण का उपयोग करके यह स्पष्ट करने के लिए उपयोग कर रहा था कि 'संकल्प' फ़ंक्शन वास्तव में 'पूरा' कार्य कर रहा है क्योंकि यह केवल मूल्य के साथ गुजरता है, उर्फ ​​वचन – rrowland

+0

@rrowland Is _ को पूरा करता है "क्या नए नियमों के लिए कोई मामला बनना है ? "_ वास्तविक सवाल? – guest271314

+0

मुझे एहसास हुआ कि मेरा मूल प्रश्न अस्पष्ट था और मेरे द्वारा उपयोग किए जाने वाले उदाहरण भ्रामक हो सकते हैं। मैंने अपना प्रश्न अपडेट किया है। मैंने पहले ही अपना जवाब खोज लिया है लेकिन आपका जवाब सही रास्ते पर दिखता है। यदि आप इसे पूरा करने के बजाय वादा को अस्वीकार करने के लिए 'हल' का उपयोग कैसे किया जा सकता है, इस बारे में जानकारी शामिल कर सकते हैं, तो मैं इसे पूरा उत्तर मानूंगा। – rrowland

1

मुझे लगता है कि यह कहना आम है कि वादा हल हो गया है या बस गया है। वादे का संकल्प वह प्रक्रिया है जिसमें वादा pending राज्य से चलता है और कहा गया राज्य से संबंधित मूल्य प्राप्त करता है। इसलिए, यदि कोई वादा fulfilled या rejected है तो यह एक हल किया गया वादा होगा (क्योंकि यह संकल्प प्रक्रिया समाप्त हो गई है)। यदि कोई वादा संकल्प प्रक्रिया में प्रवेश करता है और कभी भी किसी अन्य राज्य में संक्रमण नहीं करता है तो यह कहा जाता है कि वादा अनसुलझा है (संकल्प प्रक्रिया कभी खत्म नहीं हुई)।

अन्य शर्तों के बारे में rejected या fulfilled, वे अन्य दो राज्य हैं जिनमें pending वादा से संक्रमण हो सकता है। reject बहुत स्पष्ट आईएमओ है, यह उन मामलों को संभालता है जिनमें विफलता होने वाली है। अब मैं सहमत हूं कि fulfill कुछ हद तक संदिग्ध हो सकता है क्योंकि इसका मतलब यह हो सकता है कि वादा सफलतापूर्वक पूरा हो गया है (जैसा कि हल किया जा रहा है)। यह संकल्प प्रक्रिया का वर्णन नहीं करना चाहिए बल्कि काम की सफलता (या त्रुटि की अनुपस्थिति) हाथ में है।

संकल्प प्रक्रिया (एक वादा को हल करने के लिए) A+ spec में देखा जा सकता है।

संपादित करें।

लोग आमतौर पर resolve का उपयोग पहली तर्क के नाम के रूप में करते हैं क्योंकि ऐसा पहला तर्क के रूप में पारित कॉलबैक समाधान प्रक्रिया को आमंत्रित करता है। यह वादा पूरा नहीं करता है (वादा अभी भी खारिज कर दिया जा सकता है), यह सिर्फ वादे को हल करना शुरू कर देता है। reject तकनीक को spec में निर्दिष्ट नहीं किया गया है, यह वास्तव में संकल्प प्रक्रिया के छोटे सर्किटों की तरह है ताकि वादा reject (वास्तव में आपको हल नहीं किया गया) के साथ सुलझाया जा सके।

यहाँ कुछ उदाहरण हैं जहां presolve का उपयोग करके अस्वीकार कर दिया है कर रहे हैं:

इस बिंदु 2.3.1 है।

var p = new Promise(resolve => setTimeout(() => resolve(p), 0)); 

इस बिंदु 2.3.2.3 है।

var p = Promise.resolve(Promise.reject('reason')); 

यह बिंदु 2.3.3.2 है।

var thenable = { get then() { throw new Error(); } } 
var p = Promise.resolve(thenable); 

यह इस बिंदु 2.3.3.4.2

var thenable = { 
    then: function(){ 
     throw new Error(); 
    } 
} 
var p = Promise.resolve(thenable); 

मैं Promise.resolve यहाँ बजाय प्रयोग समारोह वादा निर्माता के लिए नीचे पारित की पहली बहस के है बिंदु 2.3.3.3.3

var thenable = { 
    then: function(resolvePromise, rejectPromise){ 
     rejectPromise(new Error()); 
    } 
} 
var p = Promise.resolve(thenable); 

है, लेकिन वे वही होना चाहिए। कई बार resolve समारोह निर्माता के लिए नीचे पारित कर दिया है:

var p = this; 
var cb = function(x){ 
    resolve(p, x); 
} 

आप निश्चित रूप से नीचे के रूप में इन परीक्षणों लिख सकते हैं:

var p = new Promise(function(resolve){ 
    resolve(thenable); 
}); 
2

हम एक और वादे के साथ एक वादा हल कर सकते हैं।

अपने दूसरे प्रश्न पहले प्रश्न का उत्तर देने: हाँ, वहाँ है, जिसमें मूल्य हम पारित में वादा किया जा रहा है को अस्वीकार कर दिया हो सकती हल करने एक उदाहरण है, और कहा कि हम इसे एक को अस्वीकार कर दिया वादा पारित अगर, उदाहरण के लिए है Promise.reject()

अपने पहले सवाल का जवाब देने की संकल्प और को पूरा ही नहीं है: मामले पर विचार करें जहां मूल्य हम हल करने पारित एक वादा लंबित है। इस मामले में हमारे अपने वादे तुरंत एक परिणाम के रूप निपटारा करेगा नहीं:

a().then(() => new Promise(setTimeout)).catch(e => console.error(e)); 

इस मामले में हम कहते हैं एक वादा एक और वादा "का संकल्प लिया" है, और यह भी लंबित है।

यह सब then अंदर हमारी पीठ के पीछे क्या हो रहा है, तो यह एक पुरानी मामले को देखने के लिए जहां a वादों (कॉलबैक लेता है) का समर्थन नहीं करता आसान हो सकता है, और हम चीजों को सही ढंग से समतल नहीं है:

// Old times and unflattened for exposition: 
new Promise((resolve, reject) => a(function(result) { 
    resolve(new Promise(setTimeout)); 
}, reject)) 
.then(() => console.log("after setTimeout")) 
.catch(e => console.error(e)); 

यहां हम और स्पष्ट रूप से देखते हैं कि को हल करने के लिए एक और वादा किया जाता है।महत्वपूर्ण रूप से, वादा संकल्प लिया को पूरा नहीं करता है और दूसरा वादा निराकरण जब तक "after setTimeout" संदेश आग है, जो बिंदु पर दोनों वादों (बन दूसरे शब्दों में पूरा (एक गैर वादा setTimeout से undefined मूल्य के साथ): इन दो वादे ने सिर्फ resolve chain बनाया)।

संकल्प लिया कि अलग है पूरा या यहाँ तक कि बसे (पूरा या अस्वीकार कर दिया, लंबित नहीं) से यह समझ के लिए महत्वपूर्ण है।

States and Fates से

:

  • कहता है: पूरा, को अस्वीकार कर दिया, लंबित
  • भाग्य: हल, अनसुलझा

भाग्य कि क्या एक भी वादा के भाग्य पर पहुँच गया है को संदर्भित करता है, और क्योंकि संकल्प श्रृंखला के किसी भी राज्य के लिए संक्रमण के लिए सीधे अनुरूप नहीं है,।

+0

क्या होगा यदि 'Promise.reject() 'को' हल 'करने के लिए पास किया गया है? क्या इस वादे को अस्वीकार करने का कारण नहीं होगा? – rrowland

+0

अपने स्वयं के प्रश्न का उत्तर देने के लिए: 'हल करें (Promise.reject())' वादा के भाग्य को किसी अन्य वादे को हल कर देगा जिसे अस्वीकार कर दिया गया है, जिसके परिणामस्वरूप इस वादे को खारिज कर दिया गया है।मुझे लगता है कि यहां महत्वपूर्ण और भ्रामक कारक यह है कि 'संकल्प' एक भाग्य संक्रमण का जिक्र कर रहा है और 'अस्वीकार' राज्य संक्रमण का जिक्र कर रहा है। मुझे लगता है कि केवल 'हल' आवश्यक है और 'अस्वीकार' 'संकल्प (Promise.reject())' के लिए एक भ्रमित चीनी कार्य है। – rrowland

+0

इसे तुरंत खारिज कर दिया जा सकता है, spec कहीं भी नहीं कहता है कि अस्वीकृति असीमित रूप से होनी चाहिए हालांकि 'हैंडलर को हमेशा असीमित रूप से कहा जाता है। – MinusFour

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