একটি প্রতিশ্রুতি থেকে ফিরে ()


118

আমি এর মতো একটি জাভাস্ক্রিপ্ট কোড পেয়েছি:

function justTesting() {
  promise.then(function(output) {
    return output + 1;
  });
}

var test = justTesting();

আমি বরাবরই পরীক্ষার জন্য একটি অপরিবর্তিত মান পেয়েছি। আমি মনে করি যে এটি প্রতিশ্রুতিগুলি এখনও মীমাংসিত হয়নি কারণ কোন প্রতিশ্রুতি থেকে কোনও মূল্য ফেরত দেওয়ার উপায় আছে?


21
একটি then()কল ফেরতের মান আবার একটি প্রতিশ্রুতি, যা আপনার প্রত্যাবর্তিত মান আবৃত।
সিরকো

আপনার একটি বাক্য গঠন ত্রুটি আছে, আমি এটি এমনকি পার্স বলে মনে করি না।
djechlin

4
পরীক্ষা অপরিজ্ঞাত কারণ জাস্ট টেস্টিং আপনার উদাহরণে কিছুই দেয় না (আপনার কোনও রিটার্ন নেই)। একটি রিটার্ন যোগ করুন এবং পরীক্ষা একটি প্রতিশ্রুতি হিসাবে সংজ্ঞায়িত করা হবে।
জেরোম ওয়াগনার

1
প্রতিক্রিয়াটির জন্য ধন্যবাদ .. এই পয়েন্টটি পরীক্ষার জন্য আউটপুট +1 নির্ধারণ করা।
প্রিজ্সি

4
পরিবর্তনশীল কি promise। আপনি এটি কোথাও সংজ্ঞায়িত দেখান না এবং আপনি আপনার justTesting()কার্য থেকে কোনও কিছুই ফিরিয়ে দেন না don't আপনি যদি আরও ভাল সহায়তা চান তবে আপনার যে সমস্যাটি সমাধান করার চেষ্টা করছেন তা বর্ণনা করার দরকার যা কেবলমাত্র আমাদের "কোড" বন্ধ করে দেখানোর চেয়েও বোঝায় যে এটি আপনি কী করতে চাইছেন তা চিত্রিতও করে না। আপনি যে সমস্যাটি সমাধান করার চেষ্টা করছেন তা ব্যাখ্যা করুন।
jender00

উত্তর:


136

আপনি যখন কোনও then()কলব্যাক থেকে কিছু ফিরিয়ে দেন , এটি কিছুটা যাদু। আপনি যদি কোনও মান ফিরিয়ে দেন তবে পরবর্তীটিকে then()সেই মানটি দিয়ে ডাকা হবে। তবে, আপনি যদি প্রতিশ্রুতির মতো কোনও কিছু ফেরত দেন, পরবর্তীটি then()এটির জন্য অপেক্ষা করে এবং যখন সেই প্রতিশ্রুতি স্থির হয় তখনই তাকে ডাকা হয় (সফল / ব্যর্থ হয়)।

উত্স: https://developers.google.com/web/fundamentals/getting-st সূত্র/ primers / promises#queuing- asynchronous- tives


এই কারণে কারণ ভালো বলে মনে হচ্ছে, তারপর আমি Ajax সঙ্গে অ্যারের iterating জন্য প্রতিশ্রুতি শৃঙ্খল কি করতে পারেন সিঙ্ক্রোনাস মধ্যে অনুরোধ stackoverflow.com/q/53651266/2028440
Bằng Rikimaru

83
প্রশ্নের উত্তর দেয়নি।
অ্যান্ড্রু

সম্পর্কিত লিঙ্ক
মেরিনোস

1
তাহলে সমাধান কী?
অপূর্ব

58

প্রতিশ্রুতি ব্যবহার করতে, আপনাকে হয় এমন একটি ফাংশন কল করতে হবে যা একটি প্রতিশ্রুতি তৈরি করে অথবা আপনাকে নিজেই এটি তৈরি করতে হবে। আপনি আসলে কোন সমস্যাটি সমাধান করার চেষ্টা করছেন তা আপনি সত্যিই বর্ণনা করেন না তবে আপনি কীভাবে নিজেকে একটি প্রতিশ্রুতি তৈরি করবেন তা এখানে:

function justTesting(input) {
    return new Promise(function(resolve, reject) {
        // some async operation here
        setTimeout(function() {
            // resolve the promise with some value
            resolve(input + 10);
        }, 500);
    });
}

justTesting(29).then(function(val) {
   // you access the value from the promise here
   log(val);
});

// display output in snippet
function log(x) {
    document.write(x);
}

বা, যদি আপনার ইতিমধ্যে কোনও ফাংশন থাকে যা কোনও প্রতিশ্রুতি দেয়, আপনি সেই ফাংশনটি ব্যবহার করতে পারেন এবং তার প্রতিশ্রুতি ফিরে দিতে পারেন:

// function that returns a promise
function delay(t) {
  return new Promise(function(resolve) {
    setTimeout(function() {
      resolve();
    }, t);
  });
}

function justTesting(input) {
  return delay(100).then(function() {
    return input + 10;
  });
}

justTesting(29).then(function(val) {
  // you access the value from the promise here
  log(val);
});

// display output in snippet
function log(x) {
  document.write(x);
}


2
কি আমাকে ছোঁড়ার দ্বিগুণ return, অর্থাৎ justTestingবলেছেন return.then => return। আমি জানি এই বিসিএস আমি এটি প্রয়োগ করেছি (বিসিএস লেটিং আমাকে বাধ্য করেছিল, এ থেকে দূরে new Promise), তবে কীভাবে আপনি কীভাবে বুঝতে পারবেন / সেই রিটার্ন / রিটার্নের জুটিটি ভাবেন?
রনি রয়স্টন

2
@ রনরস্টন - প্রথমে আপনি যে ফাংশনটি পাস করবেন তা .then()হ'ল যুক্ত ফাংশন থেকে আলাদা ফাংশন তাই যখন এটি ডাকা হয় তখন এর নিজস্ব ফিরতি মূল্য থাকে। দ্বিতীয়ত, কোনও .then()হ্যান্ডলার থেকে ফেরতের মান প্রতিশ্রুতির সমাধান হওয়া মান হয়ে যায় becomes সুতরাং, .then(val => {return 2*val;})থেকে সমাধান করা মান থেকে পরিবর্তন valকরা হচ্ছে 2*val
jender00

13

আমি এখানে যা করেছি তা হ'ল আমি জাস্ট টেস্টিং ফাংশন থেকে একটি প্রতিশ্রুতি ফিরিয়ে দিয়েছি। ফাংশনটি সমাধান হওয়ার পরে আপনি ফল পেতে পারেন get

// new answer

function justTesting() {
  return new Promise((resolve, reject) => {
    if (true) {
      return resolve("testing");
    } else {
      return reject("promise failed");
   }
 });
}

justTesting()
  .then(res => {
     let test = res;
     // do something with the output :)
  })
  .catch(err => {
    console.log(err);
  });

আশাকরি এটা সাহায্য করবে!

// old answer

function justTesting() {
  return promise.then(function(output) {
    return output + 1;
  });
}

justTesting().then((res) => {
     var test = res;
    // do something with the output :)
    }

"// এ আউটপুট দিয়ে কিছু করা" আমি একটি রিটার্ন স্টেটমেন্ট দিলে কী হবে? উদাহরণস্বরূপ: প্যারেন্ট ফাংশনের মধ্যে আমার কাছে "জাস্টস্টেস্টিং () ... তারপর ..." থাকবে। আমি কি "তখন" অংশের মধ্যে কোনও মান ফিরিয়ে দিতে সক্ষম হব?
mrzepka

আপনি যদি // এর থেকে কোনও মানটি আউটপুট দিয়ে কিছু করতে চান তবে আপনাকে জাস্ট টেস্টিং () এর আগে একটি রিটার্ন যুক্ত করতে হবে। উদাহরণস্বরূপ, "জাস্ট টেস্টিং () ফেরান (তারপরে (পুনরায়) => {রিটার্ন পুনরায়;});
বিদুর সিঙ্গলা

ঠিক আছে যা আমি প্রত্যাশা করেছিলাম, আমি কেবল এটি নিশ্চিত করতে চেয়েছিলাম :) ধন্যবাদ!
mrzepka

তখন থেকে যদি আমরা পরীক্ষায় ফিরে যাই?
মেভিমলকুমার

3

আমি প্রতিশ্রুতিগুলির বিভ্রান্তি থেকে মুক্তি পেতে "অপেক্ষা" কমান্ড এবং অ্যাসিঙ্ক ফাংশনগুলি ব্যবহার করতে পছন্দ করি,

এক্ষেত্রে আমি প্রথমে একটি অ্যাসিনক্রোনাস ফাংশন লিখব, এটি এই প্রশ্নের অংশ হিসাবে "প্রতিশ্রুতি" এর অধীনে অজ্ঞাতনামা ফাংশনটির পরিবর্তে ব্যবহৃত হবে:

async function SubFunction(output){

   // Call to database , returns a promise, like an Ajax call etc :

   const response = await axios.get( GetApiHost() + '/api/some_endpoint')

   // Return :
   return response;

}

এবং তারপরে আমি এই ফাংশনটি মূল ফাংশন থেকে কল করব:

async function justTesting() {
   const lv_result = await SubFunction(output);

   return lv_result + 1;
}

এখানে উল্লেখযোগ্য যে আমি মূল ফাংশন এবং উপ ফাংশন উভয়ই এখানে এসিঙ্ক ফাংশনে ফিরিয়েছি।


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