2013-05-08 10 views
14

से एक वायदा हैंडलर समारोह बाइंडिंग मैं जैसे कुछ कोड है। मुझे पता है कि मुझे myFunc.bind(this) का उपयोग करना होगा, लेकिन myFunc के स्थान पर मैं क्या बदलूं?एक वस्तु

+0

promisses आप किस तरह के बारे में बात कर रहे हैं? जावास्क्रिप्ट प्रोमिस अभी भी ES6 – fmsf

+0

के लिए चर्चा में है हां, मैं जावास्क्रिप्ट के वादे के बारे में बात कर रहा हूं। –

+0

यह विश्वास करना मुश्किल है, es6 जावास्क्रिप्ट वादे अभी भी लागू नहीं किए गए हैं। आपको अधिक संदर्भ प्रदान करने की आवश्यकता है। http://mozilla.6506.n7.nabble.com/ समझौता- भविष्य-asynchrony-in-then-td278846.html#a279080 – fmsf

उत्तर

35

आप bind इस तरह उपयोग कर सकते हैं:

var bar = foo().then(function success(value) { 
    // compute something from a value... 
}, function failure(reason) { 
    // handle an error... 
}.bind(this)); 
4

आप वर्तमान में अपने विफलता कॉलबैक द्वारा एक अज्ञात (हालांकि लेबल) समारोह है:

function failure(reason) { 
    // handle an error... 
} 

robertklep कहते हैं, तो आप तुरंत .bind कॉल कर सकते हैं उस अज्ञात समारोह पर।

function success(value) { 
    // compute something from a value... 
} 
function failure(reason) { 
    // handle an error... 
} 
var bar = foo().then(success, failure.bind(this)); 
+0

मुझे लगता है कि आपका मतलब है 'विफलता = failure.bind (यह) '? – robertklep

+1

@robertklep आह, हो सकता है; मैं वास्तव में '.bind()' से परिचित नहीं हूँ। यदि यह जगह पर अभिनय करने की बजाय एक नई वस्तु देता है, तो मुझे लगता है कि 'foo()। (सफलता, विफलता। बाइंड (यह));' काफी पठनीय होगा। – IMSoP

+1

हाँ यह एक नई वस्तु देता है :) क्योंकि अधिक पढ़ने योग्य होने के लिए, यह बहस का विषय है;) – robertklep

0

क्या मैं बहुत उपयोगी पाया एक खाली करने के लिए प्रत्येक then() के [समारोह] हैंडलर बाध्य करने के लिए है: हालांकि, यह बजाय एक नामित समारोह का उपयोग करने के लिए, और .then() में एक चर के रूप में इसे पारित अधिक पठनीय हो सकता है ऑब्जेक्ट, इसलिए प्रत्येक फ़ंक्शन तक पहुंच हो सकती है। फिर उपयोगकर्ता this कीवर्ड द्वारा प्रत्येक वचन में गुण सेट और प्राप्त कर सकता है। इकाई परीक्षण ढांचे समान रूप से काम करता है।

chainPromiseList([getName,getAge],finalDone,rejectHandle); 
 

 
    function chainPromiseList(promiseList,finalDone,errHandle){ 
 
     var userContext = new UserContext(); 
 
     if(typeof finalDone==='function') promiseList.push(finalDone); 
 
     if(typeof errHandle==='function') promiseList.push(errHandle); 
 
     return promiseList.reduce((total,curVal,curInd,arr)=>{ 
 
     var last = curInd+1===arr.length; 
 
     var method = last&&typeof errHandle==='function' ? 'catch':'then'; 
 
     var concatenated = total[method](curVal.bind(userContext)); 
 
     return concatenated; 
 
     },Promise.resolve()); 
 
     function UserContext(){}; 
 
    } 
 
    
 
    function getName(){ 
 
     return new Promise((resolve,reject)=>{ 
 
     setTimeout(()=>{ 
 
      console.log('got name!'); 
 
      this.name = 'Paul'; 
 
      resolve(); 
 
     },500); 
 
     }); 
 
    } 
 

 
    function getAge(){ 
 
     return new Promise((resolve,reject)=>{ 
 
     setTimeout(()=>{ 
 
      console.log('got age!'); 
 
      this.age = 26; 
 
      resolve(); 
 
     },500); 
 
     }); 
 
    } 
 

 
    function finalDone(){ 
 
     console.log(`Hello, I'm ${this.name} and I'm ${this.age}yo.`); 
 
    } 
 

 
    function rejectHandle(msg){ 
 
     console.log('Error: ',msg); 
 
    }