প্রতিশ্রুতিবদ্ধ, পরে শৃঙ্খলে অতিরিক্ত পরামিতিগুলি পাস করুন


101

একটি প্রতিশ্রুতি, উদাহরণস্বরূপ:

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

.then()প্রতিশ্রুতি অনুযায়ী পদ্ধতিটি কল করার পরে :

P.then(doWork('text'));

তারপরে doWorkফাংশনটি এর মতো দেখাচ্ছে:

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

প্রতিশ্রুতি এবং পাঠ্য পরামিতি থেকে ডেটা অ্যাক্সেস পেতে কীভাবে আমি ডুওর্কে কোনও অভ্যন্তরীণ ফাংশন ফিরিয়ে এড়াতে পারি? অভ্যন্তরীণ ফাংশন এড়ানোর কোনও কৌশল আছে?


4
কেন কেউ ইচ্ছাকৃতভাবে তরকারী ত্যাগ করবেন ? ঘৃণ্য bindপদ্ধতি ব্যবহার করার জন্য ? - যা অত্যন্ত ধীর।

@ ফোর আমি আপনাকে বুঝতে পারি না, আপনি দয়া করে স্পষ্টতার জন্য কিছু কোড সরবরাহ করতে পারেন?
রোল্যান্ড

উত্তর:


88

আপনি Function.prototype.bindএটির মতো প্রথম যুক্তিতে পাস করা মান সহ একটি নতুন ফাংশন তৈরি করতে ব্যবহার করতে পারেন

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

এবং আপনি পরিবর্তন করতে পারেন doWork,

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

এখন, textআসলে হবে 'text'মধ্যে doWorkএবং dataপ্রতিশ্রুতি দ্বারা সমাধান মান হতে হবে।

দ্রষ্টব্য: দয়া করে নিশ্চিত হন যে আপনি আপনার প্রতিশ্রুতি শৃঙ্খলে একটি প্রত্যাখ্যান হ্যান্ডলার সংযুক্ত করেছেন।


কার্যকারী প্রোগ্রাম: বাবেলের আরপিএলে লাইভ কপি

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);

ধন্যবাদ, এটি সাহায্য করে, এর আগে আমি doWork.call (এটি, 'পাঠ্য') চেষ্টা করি, তবে ডেটা 'পাঠ্য' দ্বারা প্রতিস্থাপন করা হয়েছিল
user3110667

4
callস্থানে একটি ফাংশন প্রার্থনা bindকরে, একটি নতুন ফাংশন তৈরি করে, তবে উভয়ই তাদের প্রথম যুক্তি হিসাবে মৃত্যুদন্ড কার্যকর করার প্রসঙ্গটি গ্রহণ করে।
sdgluck

103

সম্ভবত সবচেয়ে সহজ উত্তর:

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

বা, যেহেতু এটি ট্যাগ ecmascript-6করা হয়েছে তীর ফাংশনগুলি ব্যবহার করে:

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

আমি এটি সর্বাধিক পঠনযোগ্য, এবং খুব বেশি লেখার মতো না।


5

তরকারী ব্যবহার করুন।

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
);

এর সাথে সাবধানতা অবলম্বন করুন, যদি আপনি এই ফাংশনের প্রথম লাইনে curriedDoWorkকাজ return new Promise()করে কোনও প্রতিশ্রুতি তৈরি করেন , আপনি কল করার সাথে সাথে প্রতিশ্রুতি কার্যকর করা হবে curriedDoWork()(যেমন আপনি করেন..then(curriedDoWork('text'))
ফ্লেম

@ ফ্লেম: সংক্ষিপ্ত উত্তর, আপনার সুবিধার্থে আপনি এই প্রতিশ্রুতিটি কোনও কার্যক্রমে আবদ্ধ করতে পারেন, যদি আপনি এটি করতে চান তবে।
জার্মাইনে

@ ইয়াক্স, আপনি এই সিনট্যাক্সটি নির্দেশ করতে পারতেন যা বেশ আকর্ষণীয় কনস্ট্রিড ওয়ার্ক ওয়ার্ক = পাঠ্য => ডেটা => কনসোল.লগ (ডেটা + পাঠ্য)
জার্মাইনে

4
@ জারমেইন আহা হ্যাঁ আমি আগে এই ফর্মটি দেখেছি, ফাংশনাল প্রোগ্রামিং পছন্দ করতে চাই। তবে আমি কিছু ব্রাউজারে তীরের ফাংশন ভাঙ্গার অভিজ্ঞতা পাই, তাই আমি এখনই এড়াতে চাই।
yks

@yks, শুধুমাত্র ইন্টারনেট এক্সপ্লোরার এটা এজ কারণে সমর্থন করে না এবং কখনও করবে, ইন্টারনেট এক্সপ্লোরার গত বিল্ড উপর 9 ম ডিসেম্বর 2015. চল যাই ছিল ~
জার্মেই

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
}

এই সংযুক্ত হবে text: 'myArgString'থেকে thisফাংশন মধ্যে প্রেক্ষাপটে।


0

এই প্রশ্নের নতুন উত্তরটি হ'ল তীর ফাংশনগুলি (যা স্বয়ংক্রিয়ভাবে বাঁধাই করে thisএবং আরও বেশি পাঠযোগ্য । লিঙ্কগুলির জন্য গুগল যেমন: https://2ality.com/2016/02/arrow-function-vs-bind.html

আপনি পাঠ্যটি সেট করতে পারেন:

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

দ্রষ্টব্য: this.textভিতরে doWork"পাঠ্য" মূল্যায়ন করবে ate

এটি উপরের জিব দ্বারা প্রস্তাবিত এবং এটি (বা এটি!) এখনই গ্রহণযোগ্য উত্তর হওয়া উচিত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.