एक वादा समारोह में पैरामीटर कैसे पास करें


122

यह एक मूर्खतापूर्ण सवाल लग सकता है लेकिन मैं इस विषय में एक नौसिखिया हूं। मैं नोड js पर वादों पर काम कर रहा हूँ। और मैं एक वादा समारोह में पैरामीटर पास करना चाहता हूं। हालाँकि मैं इसका पता नहीं लगा सका।

someModule.someFunction.then(username, password,function(uid) {
  /*stuff */
}

और फ़ंक्शन कुछ इस तरह है

var someFunction = new Promise(username, password, function(resolve, reject) {
  /*stuff using username, password*/
  if ( /* everything turned out fine */ ) {
    resolve("Stuff worked!");
  } else {
    reject(Error("It broke"));
  }
});

1
ऐसा करने का कोई कारण नहीं है, आप सिर्फ usernamepassword
एडेनो

लेकिन मैं एक अन्य मॉड्यूल से वादे को बुला रहा हूं, और उपयोगकर्ता नाम और पासवर्ड भी स्थिर नहीं है, लेकिन क्लाइंट-साइड से आ रहा है। क्या ग्लोबाल वैरिएबल के कुछ लोगों को परिभाषित करना सुरक्षित है जो एक फ़ंक्शन सेट करता है और दूसरा उपयोग करता है। क्या कोई जोखिम है जो चर को दूसरे ग्राहक द्वारा बदल दिया जाता है?
कुंडांते 15

1
@kundante आपको किसी भी ग्लोबल्स की आवश्यकता नहीं है। बंद के बारे में जानें।
SLACs 15

@adeneo वादा async है - क्या होगा अगर वह पहला वादा हल करने से पहले दूसरी बार फ़ंक्शन को आमंत्रित करता है?
मावग का कहना है कि मोनिका

जवाबों:


234

किसी फ़ंक्शन के अंदर अपना वादा लपेटें या यह तुरंत अपना काम करना शुरू कर देगा। साथ ही, आप फ़ंक्शन को पैरामीटर पास कर सकते हैं:

var someFunction = function(username, password) {
  return new Promise(function(resolve, reject) {
    /*stuff using username, password*/
    if ( /* everything turned out fine */ ) {
      resolve("Stuff worked!");
    } else {
      reject(Error("It broke"));
    }
  });
}

फिर, इसका उपयोग करें:

someModule.someFunction(username, password).then(function(uid) {
  /* stuff */
})

 

ES6:

const someFunction = (username, password) => {
  return new Promise((resolve, reject) => {
    /*stuff using username, password*/

    if ( /* everything turned out fine */ ) {
      resolve("Stuff worked!");
    } else {
      reject(Error("It broke"));
    }
  });
};

उपयोग:

someModule.someFunction(username, password).then(uid => {
  /* stuff */
});

क्या है someModule?
Si8

3
यह ओपी से एक उदाहरण है
शनूर

3
@ शनूर क्या है uid? क्या यह स्ट्रिंग "स्टफ काम किया!" है।
पुरानी गीजर

2
@OldGeezer, यह वादा से वापसी को धारण करने के लिए एक चर है। इस मामले में, हाँ, "स्टफ काम किया जाएगा!"।
शनूर

क्या आप जानते हैं कि नए वादे के भीतर मूल वर्ग से किसी फ़ंक्शन को कैसे कॉल किया जाए?
टाइमपारडॉक्स

7

दूसरा तरीका ( अवश्य देखें ):

var promise1 = new Promise(function(resolve, reject) {
  resolve('Success!');
});
var extraData = 'ImExtraData';
promise1.then(function(value) {
  console.log(value, extraData);
  // expected output: "Success!" "ImExtraData"
}, extraData);


2
आपका उदाहरण बेहतर होगा यदि आप किसी ऐसे सरणी या ऑब्जेक्ट के साथ हल करते हैं, जिसमें आप इतने सारे तर्कों को डिक्रिप्ट करते हैं और वर्बोज़ वादा पहले से ही हल किया गया है, जैसे: Promise.resolve ([arg1, arg2, arg3]);
user5389726598465

1
मुझे लगता है कि यह गलत है क्योंकि दूसरा पैरामीटर जो पारित किया गया thenहै वह अस्वीकार फ़ंक्शन के रिटर्न मान को संभालने के लिए कॉलबैक है। इसके बजाय resolve('Success!');कोशिश reject('Error');हम त्रुटि प्राप्त होगी: Unhandled promise rejectionयहाँ हम उत्पादन देखते हैं क्योंकि var extraData = 'ImExtraData';एक है वैश्विक क्योंकि का उपयोग कर इसे पास करने का चर और नहींthen
shakiba Moshiri

यदि आप इसे पास नहीं करते हैं तो आप इसे एक्सेस नहीं कर सकते क्योंकि इसमें वादे की गुंजाइश नहीं है / फिर यदि आप इसे पास नहीं करते हैं।
सादिक

इसे हटाने की कोशिश करें और देखें कि यह काम करता है या नहीं? codepen.io/k-five/pen/ZNOvKG अपने ब्राउज़र में कंसोल लॉग देखें
शाकिबा मोशिरी

मैं आपके कोडपेन की सराहना करता हूं, लेकिन दो अलग-अलग चर का उपयोग करता हूं और फिर वास्तविक कारक देखता हूं! एक ही लक्ष्य को प्राप्त करें। यदि सिर्फ वैश्विक चर ने ठीक काम किया है तो हमें अतिरिक्त पैरामीटर पारित करने की आवश्यकता नहीं है।
सादिक़

1

और भी छोटा

var foo = (user, pass) =>
  new Promise((resolve, reject) => {
    if (/* condition */) {
      resolve("Fine");
    } else {
      reject("Error message");
    }
  });

foo(user, pass).then(result => {
  /* process */
});

0

आप .bind () को फंक्शन में परम ( यह ) पास करने के लिए उपयोग कर सकते हैं ।

var someFunction =function(resolve, reject) {
  /* get username, password*/
  var username=this.username;
  var password=this.password;
  if ( /* everything turned out fine */ ) {
    resolve("Stuff worked!");
  } else {
    reject(Error("It broke"));
  }
}
var promise=new Promise(someFunction.bind({username:"your username",password:"your password"}));

मेरे पास यह फ़ंक्शन है कि इसे स्वीकार करने के लिए इसे कैसे संपादित किया जाए .then()जब मैं इसे एक बटन में सहेजें ' SaveImagesToFirebase = () => {const uid = firebase.auth ()। currentUser.uid; // प्रदाता कास्ट {चित्र} = this.state; images.map (छवि => {Let file = image.uri; कंसोल.log (फ़ाइल); कॉन्स्टेंट पाथ = "Img " + Math.floor (Math.random) (* 1500); कंसोल.log ("@ IMAGE") , पाथ), कास्ट रेफरी = फायरबेस (स्टोरेज provider/${uid}/ProviderGalary/${path}) (.ref ( ); रिफ.पुट (फाइल);}); }; `@ गोगोग
DevAS

@DevAS <बटन onclick = "then_function (SaveImagesToFirebase.bind (यह))"> </ बटन> स्क्रिप्ट `var तत्कालीन_क्रिया = कार्य (वादा) {नया वादा (वादा) है। (समारोह) (e) {/ * कोड *। /})}; फ़ंक्शन SaveImagesToFirebase (रिज़ॉल्यूशन, अस्वीकार) {/ * कोड * / रिज़ॉल्यूशन (/ * * * / /);} `
gogog
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.