কোনও প্রতিশ্রুতি ফাংশনে প্যারামিটার কীভাবে পাস করবেন


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
এটি করার কোনও কারণ নেই, আপনি কেবলমাত্র সংজ্ঞায়িত করতে পারেন usernameএবং passwordএকটি উচ্চতর সুযোগে
অ্যাডেনেও

তবে আমি অন্য মডিউল থেকে প্রতিশ্রুতি কল করছি, এবং ব্যবহারকারীর নাম এবং পাসওয়ার্ড স্থির নয় তবে ক্লায়েন্টের পক্ষ থেকে আসছে। কোনও ফাংশন সেট করে এবং অন্যটি ব্যবহার করে এমন গ্লোবাল ভেরিয়েবলের কিছু সংজ্ঞা দেওয়া কি নিরাপদ? ভেরিয়েবলটি অন্য ক্লায়েন্ট দ্বারা পরিবর্তিত হওয়ার কি ঝুঁকি রয়েছে?
কুন্ডান্টে

1
@ Kundante আপনার কোনও গ্লোবাল দরকার নেই। বন্ধ সম্পর্কে জানুন।
এসএলএক্স

@ অ্যাডেনেও প্রতিশ্রুতি অ্যাসিঙ্ক - প্রথম প্রতিশ্রুতি মিটিয়ে যাওয়ার আগে যদি তিনি দ্বিতীয়বার ফাংশনটি ডাকেন তবে কী হবে?
মাওগ বলছে মনিকা

উত্তর:


233

আপনার প্রতিশ্রুতি কোনও ফাংশনের ভিতরে আবদ্ধ করুন বা এটি এখনই এর কাজটি শুরু করবে। এছাড়াও, আপনি ফাংশনটিতে প্যারামিটারগুলি পাস করতে পারেন:

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
@ ওल्डজিজার, প্রতিশ্রুতি থেকে রিটার্নটি ধরে রাখার জন্য এটি কেবল একটি পরিবর্তনশীল। এই ক্ষেত্রে, হ্যাঁ, এটি "স্টাফ ওয়ার্কড!" হবে।
শানুর

নতুন প্রতিশ্রুতির মধ্যে কীভাবে প্যারেন্ট ক্লাস থেকে কোনও ফাংশন কল করতে জানেন?
টাইমপারাডক্স

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]);
ব্যবহারকারী5389726598465

1
আমি মনে করি যে এটি দ্বিতীয় প্যারামিটার যা পাস হয়েছে thenতা প্রত্যাখ্যান ফাংশনের রিটার্ন মানটি পরিচালনা করার জন্য একটি কলব্যাক । resolve('Success!');চেষ্টা করার পরিবর্তে reject('Error');আমরা ত্রুটিটি পেয়ে যাব: Unhandled promise rejectionএখানে আমরা আউটপুটটি দেখতে পাচ্ছি কারণ var extraData = 'ImExtraData';এটি একটি বৈশ্বিক পরিবর্তনশীল এবং এটি ব্যবহার করে পাস করার কারণে নয়then
শাকিবা মোশিরি

আপনি যদি এটি পাস না করেন তবে আপনি এটি অ্যাক্সেস করতে পারবেন না কারণ এতে প্রতিশ্রুতি নেই / আপনি যদি তা পাস না করেন তবে।
সাদিক 12'19

এটি অপসারণ করার চেষ্টা করুন এবং দেখুন এটি কাজ করে বা না? codepen.io/k-five/pen/ZNOvKG আপনার ব্রাউজারে কনসোল লগ দেখুন
শাকিবা মোশিরি

আমি আপনার কোডপেনের প্রশংসা করি, তবে দুটি ভিন্ন ভেরিয়েবল ব্যবহার করুন এবং তারপরে আসল ফ্যাক্টরটি দেখুন! একই বৈচিত্র্য এড়ানো। যদি কেবল বিশ্বব্যাপী পরিবর্তনশীল সূক্ষ্মভাবে কাজ করে তবে আমাদের অতিরিক্ত প্যারামিটারটি পাস করার দরকার পড়েনি।
সাদিক

0

আপনি .bind ব্যবহার করতে পারেন () PARAM (পাস এই ফাংশন)।

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 ()। বর্তমান ইউজার.ইইউডে আবেদন করি তখন রয়েছে; // সরবরাহকারী কনস্ট {চিত্রগুলি this = এই.স্টেট; images.map (চিত্র => {ফাইল = ইমেজ.উইরি; কনসোল.লগ (ফাইল); কনস্ট পাথ = " ইমজি" + ম্যাথ.ফ্লোর (ম্যাথ.র্যান্ডম () * 1500); কনসোল.লগ ("@ আইএমজি" " , পাথ); কনস্ট রেফ = ফায়ারবেস। স্টোরেজ () .ref ( provider/${uid}/ProviderGalary/${path}); রেফ.পুট (ফাইল);}); ।; g @gogog
ডিভাস

@ ডেভাস <বোতাম অনক্লিক = "তারপরে_ফাংশন (SaveImagesToFirebase.bind (এটি))"> </ বাটন> স্ক্রিপ্টটি হ'ল ওয়ার্ক_ফাংশন = ফাংশন (প্রতিশ্রুতি) {নতুন প্রতিশ্রুতি (প্রতিশ্রুতি) then (ফাংশন (ই) {/ * কোড * /})}; ফাংশন SaveImagesToFirebase (সমাধান, প্রত্যাখ্যান) {/ * কোড * / সমাধান (/ * ??? * /);} `
গোগগ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.