একটি প্রতিশ্রুতি মান অ্যাক্সেস কিভাবে?


146

আমি এঙ্গুলারের ডক্সের জন্য এই উদাহরণটি $qদেখছি তবে আমি মনে করি এটি সম্ভবত সাধারণভাবে প্রতিশ্রুতির ক্ষেত্রে প্রযোজ্য। নীচের উদাহরণটি তাদের দস্তাবেজগুলিতে মন্তব্য সহ অন্তর্ভুক্ত করা হয়েছে:

promiseB = promiseA.then(function(result) {
  return result + 1;
});

// promiseB will be resolved immediately after promiseA is resolved and its value
// will be the result of promiseA incremented by 1

আমি কীভাবে এটি কাজ করে তা পরিষ্কার নয়। যদি আমি .then()প্রথমটির ফলাফলটি কল করতে পারি .then(), তাদের শৃঙ্খলিত করি, যা আমি জানি যা আমি করতে পারি, তবে promiseBএটি একটি প্রতিশ্রুতি অবজেক্ট, টাইপের Object। এটি একটি না Number। সুতরাং তারা এর অর্থ কী "এর মান প্রতিশ্রুতির ফলাফল হবে 1 দ্বারা বাড়ানো"?

আমার কি সেইরূপে promiseB.valueবা এমন কিছু অ্যাক্সেস করার কথা রয়েছে ? সাফল্য কলব্যাক কীভাবে কোনও প্রতিশ্রুতি দেয় এবং "ফলাফল + 1" ফিরিয়ে দিতে পারে? আমি কিছু মিস করছি


আমি একটি সম্পর্কিত প্রশ্ন জিজ্ঞাসা করেছি: প্রতিশ্রুতিতে কেন () ফাংশন হয় না?
রোল্যান্ড


এই প্রশ্নটি 5 বছরের পুরানো এবং এর একটি স্বীকৃত উত্তর রয়েছে ...
অস্থায়ী_ ব্যবহারকারী_নাম

@ সাময়িকী_ ব্যবহারকারী_নাম: পুরানো প্রশ্ন এমনকি লোকেরা যে কোনও সময় কাছাকাছি ভোট দেওয়া ঠিক আছে।

উত্তর:


141

promiseAএর thenফাংশন একটি নতুন প্রতিশ্রুতি (ফেরৎ promiseB) যে অবিলম্বে পরে সমাধান করা promiseAসমাধান হয়ে গেলে, এর মান কি মধ্যে সাফল্য ফাংশন থেকে ফিরিয়ে দেওয়া হয় মান promiseA

এই ক্ষেত্রে promiseAএকটি মান দিয়ে সমাধান করা হয় - resultএবং তারপরে অবিলম্বে promiseBএর মানটির সাথে সমাধান হয় result + 1

এর মান অ্যাক্সেস promiseBকরা একইভাবে সম্পন্ন হয় আমরা ফলাফলটি অ্যাক্সেস করেছি promiseA

promiseB.then(function(result) {
    // here you can use the result of promiseB
});

ডিসেম্বর 2019 সম্পাদনা করুন : async/ awaitএখন জেএসের মান, যা উপরে বর্ণিত পদ্ধতির বিকল্প সিনট্যাক্সের অনুমতি দেয়। আপনি এখন লিখতে পারেন:

let result = await functionThatReturnsPromiseA();
result = result + 1;

এখন কোন প্রতিশ্রুতিবি নেই, কারণ আমরা প্রতিশ্রুতি ব্যবহার করে ফলাফলটি আবরণ করেছি await, এবং আপনি এটির সাথে সরাসরি কাজ করতে পারেন।

যাইহোক, awaitশুধুমাত্র একটি asyncফাংশন ভিতরে ব্যবহার করা যেতে পারে । সুতরাং সামান্য জুম আউট করার জন্য, উপরেরগুলিকে এমনভাবে থাকতে হবে:

async function doSomething() {
    let result = await functionThatReturnsPromiseA();
    return result + 1;
}

2
প্রতিশ্রুতি তাত্ত্বিকভাবে তাদের নিজস্ব জিনিস। তাদের এমন একটি ফলাফল রয়েছে যা প্রতিশ্রুতির সাফল্য ফাংশনের মাধ্যমে অ্যাক্সেস করা যায়।
Nachshon শোয়ার্জz

2
সুতরাং আপনি যদি কোনও প্রতিশ্রুতির অ্যাসিনক্রোনাস কলব্যাকের রিটার্ন মান নিয়ে কাজ করতে চান তবে এটি অন্য একটি অ্যাসিনক্রোনাস কলব্যাকের মধ্যেই করতে হবে। বোধ হয়। আমি কিছু চূড়ান্ত আদিম রিটার্ন মান পাওয়ার জন্য একটি উপায় খুঁজছিলাম তবে আমি অনুমান করি যে প্রসঙ্গটি প্রদত্ত কারণটিকে অস্বীকার করবে।
অস্থায়ী_ ব্যবহারকারী_নোহাম 14

2
@ অ্যারোভিস্টে আসলে, ইএস 6 জেনারেটরগুলির সাথে পরিচয় করিয়ে দিয়েছে যা এটি সম্ভব করে এবং ES7 এ্যাসিঙ্ক ফাংশনগুলি প্রবর্তন করে - উভয়ই আপনাকে প্রতিশ্রুতিগুলির জন্য সিনট্যাক্স চিনির সরবরাহ করে যা এটি সিঙ্ক্রোনাস কোডের মতো দেখায় (পটভূমিতে একটি রাষ্ট্রীয় যন্ত্র চালিয়ে) - তাই শক্ত করে ধরে রাখুন :)
বেনিয়ামিন গ্রুইনবাউম

25

যখন কোনও প্রতিশ্রুতি সমাধান করা / প্রত্যাখ্যান করা হয়, তখন এটি তার সাফল্য / ত্রুটি হ্যান্ডলারকে কল করবে:

var promiseB = promiseA.then(function(result) {
   // do something with result
});

thenPromiseB, যা / প্রত্যাখ্যান সমাধান করা হবে: পদ্ধতি একটি প্রতিশ্রুতি ফেরৎ promiseA থেকে সাফল্য / এরার হ্যান্ডলার থেকে ফেরত মান উপর নির্ভর করে

তিনটি সম্ভাব্য মান রয়েছে যা প্রতিশ্রুতির সাফল্য / ত্রুটি হ্যান্ডলাররা ফিরে আসতে পারে যা প্রতিশ্রুতির বিয়ের ফলাফলকে প্রভাবিত করবে:

1. Return nothing --> PromiseB is resolved immediately, 
   and undefined is passed to the success handler of promiseB
2. Return a value --> PromiseB is resolved immediately,
   and the value is passed to the success handler of promiseB
3. Return a promise --> When resolved, promiseB will be resolved. 
   When rejected, promiseB will be rejected. The value passed to
   the promiseB's then handler will be the result of the promise

এই বোঝার সাথে সজ্জিত, আপনি নিম্নলিখিতটি অনুধাবন করতে পারেন:

promiseB = promiseA.then(function(result) {
  return result + 1;
});

তত্ক্ষণাত কল প্রতিশ্রুতি দেয় অবিলম্বে। যখন প্রতিশ্রুতিটি সমাধান করা হবে, তখন এটি ফলাফলের সাফল্য হ্যান্ডলারের কাছে পাস করবে। যেহেতু প্রত্যাবর্তন মান প্রতিশ্রুতি'এর ফলাফল +1, সাফল্য হ্যান্ডলার একটি মান ফিরিয়ে দিচ্ছে (উপরের বিকল্প 2), সুতরাং প্রতিশ্রুতি সঙ্গে সঙ্গে সমাধান হবে, এবং প্রতিশ্রুতির সাফল্য হ্যান্ডলার প্রতিশ্রুতি'র ফলাফল +1 পাস করবে 1


4

.thenপ্রতিশ্রুতি ফাংশনটি ওয়াদারএ এর .thenফাংশন থেকে ফিরে আসে ।

এখানে প্রতিশ্রুতি প্রত্যাবর্তন হচ্ছে এমন একটি নম্বর, যা প্রতিশ্রুতি numberসাফল্যের ফাংশনে প্যারামিটার হিসাবে উপলব্ধ হবে । যা তখন 1 দ্বারা বাড়ানো হবে


3

আপনার বর্তমান বোঝার চেয়ে মন্তব্যটিকে কিছুটা আলাদাভাবে পার্স করা সাহায্য করতে পারে:

// promiseB will be resolved immediately after promiseA is resolved

এটি বলে যে promiseBএটি একটি প্রতিশ্রুতি তবে সমাধান হওয়ার promiseAসাথে সাথেই তা সমাধান করা হবে। এটি দেখার আরেকটি উপায় এর অর্থ হল যে promiseA.then()প্রতিশ্রুতি দেওয়া হয়েছে তা ফেরত দেয় promiseB

// and its value will be the result of promiseA incremented by 1

এর অর্থ হ'ল promiseAসমাধান করা মানটি সেই মানটি যা promiseBতার সাফল্যক্যালব্যাক মান হিসাবে গ্রহণ করবে:

promiseB.then(function (val) {
  // val is now promiseA's result + 1
});

2

পিক্সেলবিত্স উত্তরটি সঠিক এবং .then()উত্পাদন কোডে প্রতিশ্রুতির মান অ্যাক্সেস করার জন্য আপনার সর্বদা ব্যবহার করা উচিত ।

যাইহোক, প্রতিশ্রুতির মানটি নিম্নলিখিত অসমর্থিত অভ্যন্তরীণ নোড.জেএস বাইন্ডিংটি ব্যবহার করে সমাধান হওয়ার পরে সরাসরি তার অ্যাক্সেসের একটি উপায় রয়েছে:

process.binding('util').getPromiseDetails(myPromise)[1]

সতর্কতা: প্রক্রিয়া.বাইন্ডিং কখনই নোডেজ কোরের বাইরে ব্যবহার করা হত না এবং নোডেজ কোর টিম সক্রিয়ভাবে এটি অবহেলা করার জন্য খুঁজছে

https://github.com/nodejs/node/pull/22004 https://github.com/nodejs/node/issues/22064


1

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

cryA = crypto.subtle.generateKey({name:'ECDH', namedCurve:'P-384'}, true, ["deriveKey", "deriveBits"])
Promise {<pending>}
cryB = await crypto.subtle.generateKey({name:'ECDH', namedCurve:'P-384'}, true, ["deriveKey", "deriveBits"])
{publicKey: CryptoKey, privateKey: CryptoKey}

এটি একটি অ্যাসিঙ্ক ফাংশনে থাকতে হবে।
সমকাল

0
promiseA(pram).then(
     result => { 
     //make sure promiseA function allready success and response
     //do something here
}).catch(err => console.log(err)) => {
     // handle error with try catch
}

1
যদিও এই কোডটি প্রশ্নের উত্তর দিতে পারে, কীভাবে এবং কেন এটি সমস্যার সমাধান করে তা সম্পর্কিত অতিরিক্ত প্রসঙ্গ সরবরাহ করলে উত্তরের দীর্ঘমেয়াদী মান উন্নত হবে।
আলেকজান্ডার

0

আপনি সহজেই জাভাস্ক্রিপ্টে একটি অ্যাসিঙ্ক অপেক্ষা পদ্ধতি ব্যবহার করে এটি করতে পারেন।

নীচে একটি টাইমআউট ব্যবহার করে একটি ওয়েবআরটিটিসি প্রতিশ্রুতি মান পুনরুদ্ধার করার একটি উদাহরণ দেওয়া আছে।

function await_getipv4(timeout = 1000) {
    var t1 = new Date();
    while(!window.ipv4) {
        var stop = new Date() - t1 >= timeout;
        if(stop) {
            console.error('timeout exceeded for await_getipv4.');
            return false;
        }
    }
    return window.ipv4;
}

function async_getipv4() {
    var ipv4 = null;
    var findIP = new Promise(r=>{var w=window,a=new (w.RTCPeerConnection||w.mozRTCPeerConnection||w.webkitRTCPeerConnection)({iceServers:[]}),b=()=>{};a.createDataChannel("");a.createOffer(c=>a.setLocalDescription(c,b,b),b);a.onicecandidate=c=>{try{c.candidate.candidate.match(/([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/g).forEach(r)}catch(e){}}})
    findIP.then(ip => window.ipv4 = ip);
    return await_getipv4();
};


এই স্নিপেটটি এখানে না চালানো গুরুত্বপূর্ণ তবে সত্যিকারের ব্রাউজারে, আমি বিশ্বাস করি এটি স্যান্ডবক্সিংয়ের কারণে।
অক্সফিডফেস

0

নোড আরইপিএলে, একটি প্রতিশ্রুতির মান হিসাবে একটি ডিবি সংযোগ পেতে, আমি নিম্নলিখিত পদ্ধতিটি গ্রহণ করেছি:

let connection
try {
  (async () => {
    connection = await returnsAPromiseResolvingToConnection()
  })()
} catch(err) {
  console.log(err)
}

লাইনটি awaitসাধারণত একটি প্রতিশ্রুতি ফিরিয়ে দেয়। এই কোডটি নোড REPL এ আটকানো যেতে পারে বা index.jsএটিতে সংরক্ষণ করা থাকলে বাশ দিয়ে চালানো যেতে পারে

node -i -e "$(< index.js)"

যা আপনাকে সেট ভেরিয়েবলের অ্যাক্সেস সহ স্ক্রিপ্ট চালানোর পরে নোড REPL এ ফেলে দেয়। অ্যাসিক্রোনাস ফাংশন ফিরে এসেছে তা নিশ্চিত করার connectionজন্য, উদাহরণস্বরূপ আপনি লগ করতে পারেন এবং তারপরে আপনি ভেরিয়েবলটি ব্যবহারের জন্য প্রস্তুত। অ্যাসিঙ্ক্রোনাস ফাংশনটির বাইরে স্ক্রিপ্টের কোনও কোডের জন্য এখনও অ্যাসিনক্রোনাস ফাংশনটি সমাধান করা হচ্ছে না তা অবশ্যই বিশ্বাস করতে চাইবে না।


0

উপরে কিছু ভাল উত্তর আছে এবং এখানে ES6 তীর ফাংশন সংস্করণ রয়েছে

var something = async() => {
   let result = await functionThatReturnsPromiseA();
   return result + 1;
}

0

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

(async () => {
//Optional "await"
  await yourAsyncFunctionOrPromise()
    .then(function (result) {
      return result +1;
    })
    .catch(function (error) {
      return error;
    })()
})

" প্রতীক্ষিত অভিব্যক্তি অ্যাসিঙ্ক ফাংশন এক্সিকিউশনকে কোনও প্রতিশ্রুতি নিষ্পত্তি না হওয়া অবধি (যেটি সম্পন্ন বা প্রত্যাখ্যান করা হয়) এবং সিদ্ধির পরে অ্যাসিঙ্ক ফাংশনটির পুনরায় প্রয়োগ শুরু করে res "প্রতিশ্রুতি যদি প্রত্যাখ্যান করা হয় তবে প্রতীক্ষিত অভিব্যক্তি প্রত্যাখ্যানিত মানটিকে ছুড়ে ফেলে ।"

সম্পর্কে আরও পড়ুন অপেক্ষায় রয়েছেন এবং প্রতিশ্রুতিMDN ওয়েব ডক্স


-5

হতে পারে এই ছোট টাইপস্ক্রিপ্ট কোড উদাহরণ সাহায্য করবে।

private getAccount(id: Id) : Account {
    let account = Account.empty();
    this.repository.get(id)
        .then(res => account = res)
        .catch(e => Notices.results(e));
    return account;
}

এখানে repository.get(id)রিটার্ন a Promise<Account>। আমি এটিকে স্টেটমেন্টের accountমধ্যে ভেরিয়েবলের জন্য নির্ধারিত করেছি then


1
আপনার কোড প্রমিস সমাধান হওয়ার আগে অ্যাকাউন্ট ফেরত দিচ্ছে এবং এ কারণেই এটি ডাউন ভোট হয়েছে, আপনার কোড সর্বদা অ্যাকাউন্ট.empty () প্রদান করে;
Felype
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.