2015-10-02 15 views
65

वादा, के बाद हम तो कहते हैं वादे पर विधि पारित सिर्फ उदाहरणवादे, अतिरिक्त पैरामीटर तो श्रृंखला के लिए

var P = new Promise(function (resolve, reject) { 
    var a = 5; 
    if (a) { 
    setTimeout(function(){ 
     resolve(a); 
    }, 3000); 
    } else { 
    reject(a); 
    } 
}); 

के लिए

function doWork(data) { 
    return function(text) { 
    // sample function to console log 
    consoleToLog(data); 
    consoleToLog(b); 
    } 
} 

मैं वचन और पाठ पैरामीटर से डेटा तक पहुंच प्राप्त करने के लिए, डू वर्क में आंतरिक फ़ंक्शन से कैसे बच सकता हूं? अगर कोई चाल है? धन्यवाद।

+1

कोई जानबूझकर ** करी ** ** क्यों छोड़ देगा? भयानक 'बाइंड' विधि का उपयोग करने के लिए? - जो भी बेहद धीमी है। – ftor

+0

@ftor मैं आपको नहीं समझता, क्या आप स्पष्टीकरण के लिए कुछ कोड प्रदान कर सकते हैं? – Roland

उत्तर

59

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

P.then(doWork.bind(null, 'text')) 

की तरह, अपने पहले तर्क के लिए पारित एक मूल्य के साथ एक नया समारोह बनाने के लिए और आप doWork को बदल सकते हैं,

function doWork(text, data) { 
    consoleToLog(data); 
} 

अब, text हो जाएगा वास्तव में 'text'doWork और data में वादा द्वारा हल किया गया मूल्य होगा।

नोट: कृपया सुनिश्चित करें कि आप अपनी वादे श्रृंखला में अस्वीकृति हैंडलर संलग्न करते हैं।


कार्य कार्यक्रम:Live copy on Babel's REPL

function doWork(text, data) { 
    console.log(text + data + text); 
} 

new Promise(function (resolve, reject) { 
    var a = 5; 
    if (a) { 
     setTimeout(function() { 
     resolve(a); 
     }, 3000); 
    } else { 
     reject(a); 
    } 
    }) 
    .then(doWork.bind(null, 'text')) 
    .catch(console.error); 
+0

धन्यवाद, इससे मदद मिलती है, इससे पहले कि मैं doWork.call (यह, 'टेक्स्ट') करने की कोशिश करता हूं, लेकिन डेटा को 'टेक्स्ट' – user3110667

+1

'कॉल' द्वारा प्रतिस्थापित किया गया था, 'कॉल' एक नया फ़ंक्शन बनाता है, हालांकि दोनों स्वीकार करते हैं निष्पादन संदर्भ उनके पहले तर्क के रूप में। – sdgluck

63

शायद सबसे सरल जवाब है:

P.then(function(data) { return doWork('text', data); }); 

या, इस ecmascript-6 टैग है के बाद से, तीर फ़ंक्शन का उपयोग करके

P.then(data => doWork('text', data)); 

मुझे यह सबसे अधिक पठनीय लगता है, और लिखने के लिए बहुत कुछ नहीं है।

+3

धन्यवाद, उत्तरार्द्ध सिर्फ इतना ही सुंदर है जो मैंने सोचा था कि मुझे करना होगा। – JollyJoker

0

लोडाश इस सटीक चीज़ के लिए एक अच्छा विकल्प प्रदान करता है।

P.then(_.bind(doWork, 'myArgString', _)); 

//Say the promise was fulfilled with the string 'promiseResults' 

function doWork(text, data) { 
    console.log(text + " foo " + data); 
    //myArgString foo promiseResults 
} 

या, यदि आप केवल एक पैरामीटर (पूरा वादा परिणाम) है करने के लिए अपनी सफलता समारोह चाहते हैं, तो यह इस तरह से उपयोग कर सकते हैं:

P.then(_.bind(doWork, {text: 'myArgString'})); 

function doWork(data) { 
    console.log(data + " foo " + this.text); 
    //promiseResults foo myArgString 
} 

यह this को text: 'myArgString' जोड़ देती है समारोह के भीतर संदर्भ।

1

करी का उपयोग करें।

var P = new Promise(function (resolve, reject) { 
    var a = 5; 
    if (a) { 
     setTimeout(function(){ 
      resolve(a); 
     }, 3000); 
    } else { 
     reject(a); 
    } 
}); 

var curriedDoWork = function(text) { 
    return function(data) { 
     console.log(data + text); 
    } 
}; 

P.then(curriedDoWork('text')) 
.catch(
    //some error handling 
); 
संबंधित मुद्दे