আমি কীভাবে একটি জাভাস্ক্রিপ্ট প্রতিশ্রুতির রাজ্য সিঙ্ক্রোনালি নির্ধারণ করতে পারি?


149

আমার একটি খাঁটি জাভাস্ক্রিপ্ট প্রতিশ্রুতি রয়েছে (অন্তর্নির্মিত বাস্তবায়ন বা বহু-পূরণ):

var promise = new Promise(function (resolve, reject) { /* ... */ });

স্পেসিফিকেশন থেকে , একটি প্রতিশ্রুতি হতে পারে:

  • 'নিষ্পত্তি' এবং 'সমাধান'
  • 'নিষ্পত্তি' এবং 'প্রত্যাখ্যান'
  • 'বিচারাধীন'

আমার একটি ব্যবহারের মামলা রয়েছে যেখানে আমি প্রতিশ্রুতিটি সিঙ্ক্রোনজভাবে জিজ্ঞাসাবাদ করতে এবং নির্ধারণ করতে চাই:

  • প্রতিশ্রুতি নিষ্পত্তি হয়?

  • যদি তাই হয়, প্রতিশ্রুতি সমাধান করা হয়?

আমি জানি যে #then()প্রতিশ্রুতি পরিবর্তন হওয়ার পরে আমি অ্যাসিক্রোনাল হয়ে কাজ করার সময়সূচীটি ব্যবহার করতে পারি । আমি এটি কীভাবে করব তা জিজ্ঞাসা করছি না।

এই প্রশ্নের সম্পর্কে বিশেষভাবে হয় কথা দিলাম রাষ্ট্রের সমলয় জিজ্ঞাসাবাদ । আমি কীভাবে এটি অর্জন করতে পারি?


6
প্রতিশ্রুতিতে একটি সম্পত্তি সেট করুন যা বাইরে থেকে দেখা যায় এবং সম্পত্তি পরিবর্তন করার জন্য () ব্যবহার করুন।
ডান্ডাভিস

@ জোকেরিহাইম ফুইউইউ, ভি 8 উত্স কোড. google.com/p/v8/source/browse/branches/bleeding_edge/src/… দেখুন var promiseStatus = NEW_PRIVATE("Promise#status");, PromiseSetফাংশন করুনSET_PRIVATE(promise, promiseStatus, status);
গেস্ট 271314

এখানে আমরা যাচ্ছি: esdiscuss.org/topic/…
jokeyrhyme

এটি অদ্ভুত বলে মনে হচ্ছে যে আপনি যদি একটি প্রতিশ্রুতি দেন = প্রতিশ্রুতি res সমাধান ('বাজ'); console.log (ক); এবং ক্রোম কনসোলে সন্ধান করুন, আপনি প্রতিশ্রুতি দেখুন {[[প্রতিশ্রুতি স্ট্যাটাস]]: "সমাধান", [[প্রতিশ্রুতি মূল্য]]: "বাজ"} প্রোটো: প্রতিশ্রুতি [[প্রতিশ্রুতি স্ট্যাটাস]]: "সমাধান" [[প্রতিশ্রুতি]]: "বাজ "এবং লোকেরা দাবি করে যে এটি করা যায় না। ক্রোম এটি কীভাবে করছে? (কৌনিক plnkr.co/edit/IPIWgLJKQStI5ubXmcsF
JGFMK

নোড v11.12.0 কনসোল.লগ ব্যবহার করা প্রতিশ্রুতি স্থিতি প্রদর্শন করবে। EG console.log(Promise.new((resolve, reject) => {})=>Promise { <pending> }
পহলেজ

উত্তর:


77

নেটিভ জাভাস্ক্রিপ্ট প্রতিশ্রুতিগুলির জন্য এই জাতীয় কোনও সমকালীন পরিদর্শন API উপস্থিত নেই API দেশীয় প্রতিশ্রুতি দিয়ে এটি করা অসম্ভব। স্পেসিফিকেশন যেমন একটি পদ্ধতি নির্দিষ্ট করে না।

ইউজারল্যান্ডের লাইব্রেরিগুলি এটি করতে পারে এবং আপনি যদি নির্দিষ্ট ইঞ্জিনটিকে লক্ষ্য করে (ভি 8 এর মতো) এবং প্ল্যাটফর্ম কোডে অ্যাক্সেস পেয়ে থাকেন (যা আপনি মূলত কোড লিখতে পারেন ) তবে এটি অর্জনের জন্য আপনি নির্দিষ্ট সরঞ্জামগুলি (ব্যক্তিগত চিহ্ন হিসাবে) ব্যবহার করতে পারেন । এটি ইউজারল্যান্ডে না হলেও দুর্দান্ত।


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

4
এমনকি ব্যবহারের ক্ষেত্রে খুব কম দেখা গেলেও এই জাতীয় কিছু সহ কী ক্ষতি করবে? পূর্ববর্তী কাজ শেষ হয়েছে কিনা এবং আমি অন্য কোনও কাজের জন্য অনুরোধ করতে পারি কিনা তা দেখার জন্য আমার এই জাতীয় স্থিতি পরীক্ষার প্রয়োজন হবে। এবং আমি কেবল একটি বাহ্যিক ভেরিয়েবল সেট করতে পারি না কারণ অবজেক্টটি কোনও বিজ্ঞপ্তি ছাড়াই মালিক পরিবর্তন করার সম্ভাবনা রাখে। আরও বিরক্তিকর হ'ল আমি দেখতে পাচ্ছি নোড.জেএস এর কাছে এই তথ্যটি অ্যাক্সেস রয়েছে কারণ এটি আমি যখন এটি পরিদর্শন করি তখন তা এটি দেখায়, তবে স্ট্রিংগুলি পার্সিংয়ের পাশাপাশি এটিতে যাওয়ার কোনও উপায় নেই ??
টাস্টিন 2121

9
সুতরাং আমাদের অবশ্যই দেশীয় প্রতিশ্রুতিগুলি এড়াতে হবে কারণ তারা অযৌক্তিক এবং সর্বদা ব্লুবার্ড ব্যবহার করে। বড় খবর! আমি কীভাবে দেশী প্রতিশ্রুতিগুলি নোড ইঞ্জিন থেকে অবহেলিত এবং নিক্ষিপ্ত হওয়ার প্রস্তাব দেব?
ব্যবহারকারী 619271

1
প্রচুর জিনিস, .anyপরিবর্তে আমাদের চিহ্নিত করা উচিত ছিল এবং ভুল করা উচিত কারণ মার্ক জোর দিয়েছিলেন। একটির জন্য, Promise.race([])এটি চিরকালের জন্য মুলতুবি থাকা প্রতিশ্রুতি (এবং কোনও ত্রুটি নয়), আপনি সাধারণত প্রথম সফল প্রতিশ্রুতি চান, কেবল প্রথম প্রতিশ্রুতি নয়। যাইহোক, এটি জিজ্ঞাসা করা প্রশ্নের সাথে সত্যই প্রাসঙ্গিক নয় - ওপি সিঙ্ক্রোনাস পরিদর্শন সম্পর্কে জিজ্ঞাসা করেছিল .raceএবং এর সম্পর্কে এবং এর অনেক ত্রুটিগুলি সম্পর্কে নয় ।
বেনিয়ামিন গ্রুইনবাউম

5
@ আক্রিকোস উত্তরটি আপনাকে সমকালীনভাবে একটি প্রতিশ্রুতির অবস্থা পরীক্ষা করতে দেয় না - উদাহরণস্বরূপ MakeQueryablePromise(Promise.resolve(3)).isResolvedমিথ্যা হলেও প্রতিশ্রুতিটি বেশ স্পষ্টতই সমাধান হয়েছে। উত্তরের উল্লেখ না করে "সমাধান করা" এবং "পরিপূর্ণ" শব্দটিও ভুলভাবে ব্যবহার করা হচ্ছে। এই উত্তরটি করার জন্য আপনি .thenনিজেই কোনও হ্যান্ডলার যুক্ত করতে পারেন - যা সিঙ্ক্রোনাস ইন্সপেক্টের বিন্দুটিকে পুরোপুরি মিস করে।
বেনজামিন গ্রুয়েনবাউম

31

এখানে চিত্র বর্ণনা লিখুন

প্রতিশ্রুতি-অবস্থা-অ্যাসিঙ্ক কৌশলটি করে। এটি অ্যাসিঙ্ক তবে এটি thenপ্রতিশ্রুতি সমাধানের জন্য অপেক্ষা করে না।

const {promiseStatus} = require('promise-status-async');
// ...
if (await promiseStatus(promise) === 'pending') {
    const idle = new Promise(function(resolve) {
        // can do some IDLE job meanwhile
    });
    return idle;
}

4
এটি কীভাবে সিঙ্ক্রোনালিভাবে করা যায় সে সম্পর্কে ওপি জিজ্ঞাসা করেছিলেন
ক্লেসুন

28

নাহ, কোনও সিঙ্ক এপিআই নয়, তবে এখানে আমার promiseStateঅ্যাসিঙ্কটির সংস্করণটি রয়েছে (@ ম্যাথিজদের সহায়তায়):

function promiseState(p) {
  const t = {};
  return Promise.race([p, t])
    .then(v => (v === t)? "pending" : "fulfilled", () => "rejected");
}

var a = Promise.resolve();
var b = Promise.reject();
var c = new Promise(() => {});

promiseState(a).then(state => console.log(state)); // fulfilled
promiseState(b).then(state => console.log(state)); // rejected
promiseState(c).then(state => console.log(state)); // pending


এই নির্মাণের পিছনে কি কোনও নির্দিষ্ট যুক্তি রয়েছে? এটা আমার কাছে অযথা জটিল মনে হচ্ছে। যতদূর আমি এই কাজগুলি অভিন্নভাবে বলতে পারি: Promise.race([ Promise.resolve(p).then(() => "fulfilled", () => "rejected"), Promise.resolve().then(() => "pending") ]); যদিও এটি আমার কাছে নিরাপদ বলে মনে হচ্ছে: const t = {}; return Promise.race([p,t]).then(v => v === t ? "pending" : "fulfilled", () => "rejected") এবং অতিরিক্ত প্রতিশ্রুতি তৈরি করা এড়ানো যায় যা মূল পি যতক্ষণ না মজবুত থাকে।
ম্যাথিজগুলি

ধন্যবাদ @ ম্যাথিজ! আমি আমার উত্তর সরল করে তুলেছি।
জিব

16

আপনি প্রতিশ্রুতি দিয়ে প্রতিযোগিতা তৈরি করতে পারেন। সমাধান করুন
এটি সিনক্রোনাস নয় তবে এখনই ঘটে

function promiseState(p, isPending, isResolved, isRejected) {
  Promise.race([p, Promise.resolve('a value that p should not return')]).then(function(value) {
    if (value == 'a value that p should not return') {
      (typeof(isPending) === 'function') && isPending();
    }else {
      (typeof(isResolved) === 'function') && isResolved(value);
    }
  }, function(reason) {
    (typeof(isRejected) === 'function') && isRejected(reason);
  });
}

অ্যাসিঙ্ক্রোনালি তাদের অর্থ পরীক্ষা করার জন্য এবং বোঝার জন্য একটি ছোট স্ক্রিপ্ট

var startTime = Date.now() - 100000;//padding trick "100001".slice(1) => 00001
function log(msg) {
  console.log((""+(Date.now() - startTime)).slice(1) + ' ' + msg);
  return msg;//for chaining promises
};

function prefix(pref) { return function (value) { log(pref + value); return value; };}

function delay(ms) {
  return function (value) {
    var startTime = Date.now();
    while(Date.now() - startTime < ms) {}
    return value;//for chaining promises
  };
}
setTimeout(log, 0,'timeOut 0 ms');
setTimeout(log, 100,'timeOut 100 ms');
setTimeout(log, 200,'timeOut 200 ms');

var p1 = Promise.resolve('One');
var p2 = new Promise(function(resolve, reject) { setTimeout(resolve, 100, "Two"); });
var p3 = Promise.reject("Three");

p3.catch(delay(200)).then(delay(100)).then(prefix('delayed L3 : '));

promiseState(p1, prefix('p1 Is Pending '), prefix('p1 Is Resolved '), prefix('p1 Is Rejected '));
promiseState(p2, prefix('p2 Is Pending '), prefix('p2 Is Resolved '), prefix('p2 Is Rejected '));
promiseState(p3, prefix('p3 Is Pending '), prefix('p3 Is Resolved '), prefix('p3 Is Rejected '));

p1.then(prefix('Level 1 : ')).then(prefix('Level 2 : ')).then(prefix('Level 3 : '));
p2.then(prefix('Level 1 : ')).then(prefix('Level 2 : ')).then(prefix('Level 3 : '));
p3.catch(prefix('Level 1 : ')).then(prefix('Level 2 : ')).then(prefix('Level 3 : '));
log('end of promises');
delay(100)();
log('end of script');

বিলম্বের সাথে ফলাফল (0) (বিলম্বের সময় মন্তব্য করুন)

00001 end of promises
00001 end of script
00001 Level 1 : One
00001 Level 1 : Three
00001 p1 Is Resolved One
00001 p2 Is Pending undefined
00001 p3 Is Rejected Three
00001 Level 2 : One
00001 Level 2 : Three
00001 delayed L3 : Three
00002 Level 3 : One
00002 Level 3 : Three
00006 timeOut 0 ms
00100 timeOut 100 ms
00100 Level 1 : Two
00100 Level 2 : Two
00101 Level 3 : Two
00189 timeOut 200 ms

এবং ফায়ারফক্সের সাথে এই পরীক্ষার ফলাফল (ক্রোম অর্ডার বজায় রাখে)

00000 end of promises
00100 end of script
00300 Level 1 : One
00300 Level 1 : Three
00400 p1 Is Resolved One
00400 p2 Is Pending undefined
00400 p3 Is Rejected Three
00400 Level 2 : One
00400 Level 2 : Three
00400 delayed L3 : Three
00400 Level 3 : One
00400 Level 3 : Three
00406 timeOut 0 ms
00406 timeOut 100 ms
00406 timeOut 200 ms
00406 Level 1 : Two
00407 Level 2 : Two
00407 Level 3 : Two

প্রতিশ্রুতি স্ট্যাট .আরেক্স এবং তৈরি করুন: স্তর 2


3
পরিবর্তে 'a value that p should not return', একটি প্রতীক
প্রোগ্রামার

1
@ প্রোগ্রামার ৫০০০ সুবিধা কী?
মরিটজ স্মিটজ বনাম হালস্ট

2
@ মরিটজশ্মিটজভ.হলস্ট একটি Symbolএকটি অনন্য মূল্য হতে পারে, সুতরাং আপনাকে কখনই "মান [...] পি ফিরে পাওয়া উচিত নয়" অনুমান করতে হবে না। যাইহোক, একটি নির্দিষ্ট বস্তুর একটি রেফারেন্স ঠিক পাশাপাশি কাজ করবে।
স্কট রুডিগার

7

কোনও স্থানীয় পদ্ধতি না দেওয়া পর্যন্ত আপনি নোড.জেজে একটি (কুরুচিপূর্ণ) হ্যাক ব্যবহার করতে পারেন:

util = require('util');

var promise1 = new Promise (function (resolve) {
}

var promise2 = new Promise (function (resolve) {

    resolve ('foo');
}

state1 = util.inspect (promise1);
state2 = util.inspect (promise2);

if (state1 === 'Promise { <pending> }') {

    console.log('pending'); // pending
}

if (state2 === "Promise { 'foo' }") {

    console.log ('foo') // foo
}

3
আমি এটি একটি পলিফিল এ সিদ্ধ করেছি:Promise.prototype.isPending = function(){ return util.inspect(this).indexOf("<pending>")>-1; }
টাস্টিন 2121

5
এটা ভয়ানক
জন ওয়েইজ

পছন্দ করেছেন আমি একটি কোডবেসে একটি প্রতিশ্রুতি-পূর্ণ API একীভূত করার চেষ্টা করছি যা ধরে নেয় যে সবকিছুই সমকালীন। এটি হয় ভয়ঙ্কর কিছু করছে বা কোডের বিশাল অংশগুলি আবার লিখছে। যেভাবেই হোক আমি নৃশংসতা করছি।
রথ

4
স্রেফ ব্যবহার করুনprocess.binding('util').getPromiseDetails
আমারা

@ Tustin2121 কিছু সংস্করণের জন্য এটি এমন কিছু দিয়ে ব্যর্থ হবে Promise.resolve('<pending>')
ব্যবহারকারী 202729

7

নোডে, অননুমোদিত অভ্যন্তরীণ বলুন process.binding('util').getPromiseDetails(promise)

> process.binding('util').getPromiseDetails(Promise.resolve({data: [1,2,3]}));
[ 1, { data: [ 1, 2, 3 ] } ]

> process.binding('util').getPromiseDetails(Promise.reject(new Error('no')));
[ 2, Error: no ]

> process.binding('util').getPromiseDetails(new Promise((resolve) => {}));
[ 0, <1 empty item> ]

আমি এটি যুক্ত করেছি কারণ এটি বিদ্যমান উত্তরগুলির কোনওর মধ্যে ছিল না, এবং নোডের জন্য এটি সেরা উত্তর। github.com/nodejs/ নোডে
আমারা

6

আপডেট হয়েছে: 2019

ব্লুবার্ড.জেএস এই অফার করে: http://bluebirdjs.com/docs/api/isfulfilled.html

var Promise = require("bluebird");
let p = Promise.resolve();
console.log(p.isFulfilled());

আপনি যদি নিজের র‍্যাপার তৈরি করতে পছন্দ করেন তবে এটি সম্পর্কে একটি দুর্দান্ত ব্লগ is

যেহেতু জাভাস্ক্রিপ্ট একক থ্রেডেড, তাই অনুমানের মধ্যে এটি যুক্তি প্রমাণের পক্ষে যথেষ্ট সাধারণ ব্যবহারের কেস খুঁজে পাওয়া শক্ত। কোনও প্রতিশ্রুতি সংশোধন করা হয়েছে কিনা তা জানার সেরা জায়গাটি এখানে রয়েছে then ()। যদি কোনও প্রতিশ্রুতি পূরণ হয় তবে তা পরীক্ষার মাধ্যমে একটি পোলিং লুপ তৈরি হবে যা সম্ভবত ভুল দিক।

আপনি যদি অ্যাসিঙ্ক কোডটি সিঙ্ক্রোনিকভাবে যুক্ত করতে চান তবে অ্যাসিঙ্ক / অপেক্ষার কাজটি একটি সুন্দর নির্মাণ const

await this();
await that();
return 'success!';

আর একটি দরকারী কল হল প্রতিশ্রুতি। সমস্ত ()

var promise1 = Promise.resolve(3);
var promise2 = 42;
var promise3 = new Promise(function(resolve, reject) {
  setTimeout(resolve, 100, 'foo');
});

Promise.all([promise1, promise2, promise3]).then(function(values) {
  console.log(values);
});
// expected output: Array [3, 42, "foo"]

আমি যখন এই উত্তরটির জন্য প্রথম পৌঁছেছিলাম, সেটাই আমি ব্যবহারের ক্ষেত্রে খুঁজছিলাম।


5

আপনি আপনার প্রতিশ্রুতি এইভাবে মোড়ানো করতে পারেন

function wrapPromise(promise) {
  var value, error,
      settled = false,
      resolved = false,
      rejected = false,
      p = promise.then(function(v) {
        value = v;
        settled = true;
        resolved = true;
        return v;
      }, function(err) {
        error = err;
        settled = true;
        rejected = true;
        throw err;
      });
      p.isSettled = function() {
        return settled;
      };
      p.isResolved = function() {
        return resolved;
      };
      p.isRejected = function() {
        return rejected;
      };
      p.value = function() {
        return value;
      };
      p.error = function() {
        return error;
      };
      var pThen = p.then, pCatch = p.catch;
      p.then = function(res, rej) {
        return wrapPromise(pThen(res, rej));
      };
      p.catch = function(rej) {
        return wrapPromise(pCatch(rej));
      };
      return p;
}

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

@ বেনজামিন গ্রুয়েনবাউম: একই "টার্ন" কোডটি যদি কল করে তবে কি ডিফল্ট মানগুলি আসে না?
ডান্ডাভিস

অবশ্যই আপনাকে আপনার সমস্ত প্রতিশ্রুতি তৈরির সময় মুড়ে ফেলতে হবে। যেমন ফাংশনগুলির ভিতরে যা তাদের তৈরি করে এবং ফিরিয়ে দেয়।
স্পাইডারপিগ

3
ঠিক আছে, এই মুহুর্তে তারা সত্যিকার অর্থে দেশীয় প্রতিশ্রুতি নয়, আপনি তাদের সাব-ক্লাসিংয়ের সাহায্যে বাড়িয়ে দেওয়ার উপায়টি বাড়িয়ে দিতে পারেন যা আপনাকে কোনও বস্তুতে বানরের প্যাচিংয়ের বৈশিষ্ট্যের পরিবর্তে মার্জিতভাবে এটি করার অনুমতি দেয়।
বেনজামিন গ্রুইনবাউম

আপনি যে প্রতিশ্রুতিটি আমি দেখিয়েছি সেভাবে বা উপ-শ্রেণিবদ্ধ করে প্রসারিত হোক না কেন, প্রতিটি ক্ষেত্রেই আপনাকে তারপরে নিজের সংস্করণ যুক্ত করতে হবে এবং ধরতে হবে।
স্পাইডারপিগ

5

এটি সত্যই বেশ বিরক্তিকর যে এই প্রাথমিক কার্যকারিতাটি অনুপস্থিত। আপনি যদি নোড.জেএস ব্যবহার করে থাকেন তবে আমি দুটি কাজের ক্ষেত্র সম্পর্কে জানি, তাদের উভয়েরই খুব সুন্দর নয়। নীচে উভয় স্নিপেট একই API প্রয়োগ করে:

> Promise.getInfo( 42 )                         // not a promise
{ status: 'fulfilled', value: 42 }
> Promise.getInfo( Promise.resolve(42) )        // fulfilled
{ status: 'fulfilled', value: 42 }
> Promise.getInfo( Promise.reject(42) )         // rejected
{ status: 'rejected', value: 42 }
> Promise.getInfo( p = new Promise(() => {}) )  // unresolved
{ status: 'pending' }
> Promise.getInfo( Promise.resolve(p) )         // resolved but pending
{ status: 'pending' }

উভয় কৌশল ব্যবহার করে শেষ দুটি প্রতিশ্রুতিশীল রাজ্যের পার্থক্য করার কোনও উপায় বলে মনে হচ্ছে না।

1. V8 ডিবাগ API ব্যবহার করুন

এটি একই কৌশল util.inspectব্যবহার করে।

const Debug = require('vm').runInDebugContext('Debug');

Promise.getInfo = function( arg ) {
    let mirror = Debug.MakeMirror( arg, true );
    if( ! mirror.isPromise() )
        return { status: 'fulfilled', value: arg };
    let status = mirror.status();
    if( status === 'pending' )
        return { status };
    if( status === 'resolved' )  // fix terminology fuck-up
        status = 'fulfilled';
    let value = mirror.promiseValue().value();
    return { status, value };
};

2. সুসংগতভাবে মাইক্রোটাস্কগুলি চালান

এটি ডিবাগ এপিআই এড়ায়, তবে সমস্ত মুলতুবি ম্যাক্রোটাস্ক এবং process.nextTickকলব্যাকগুলি সিঙ্ক্রোনালি চালিত করার কারণে কিছু ভীতিজনক শব্দার্থকতা রয়েছে । পরিদর্শন প্রতিশ্রুতি জন্য ট্রিগার করা থেকে "" হাতছাড়া হওয়া প্রতিশ্রুতি প্রত্যাখ্যান "ত্রুটিটি প্রতিরোধ করারও এর পার্শ্ব-প্রতিক্রিয়া রয়েছে।

Promise.getInfo = function( arg ) {
    const pending = {};
    let status, value;
    Promise.race([ arg, pending ]).then(
        x => { status = 'fulfilled'; value = x; },
        x => { status = 'rejected'; value = x; }
    );
    process._tickCallback();  // run microtasks right now
    if( value === pending )
        return { status: 'pending' };
    return { status, value };
};

এটি করা খুব অনিরাপদ process._tickCallback(বা এমনকি সাধারণ% রানমিক্রোটিক) - এটি এলোমেলোভাবে আপনার কোডের জিনিসগুলিকে ভেঙে দেবে। আমি মরিয়া হয়ে এটি কাজ করার চেষ্টা করেছি (বেশিরভাগ অ্যাসিঙ্ক ফাংশনে নকল টাইমারদের জন্য) এবং এটি নোড দিক থেকে কখনও পর্যাপ্ত স্থিতিশীল ছিল না। আমি বাছাই করে এটিতে কাজ করা ছেড়ে দিয়েছি। ভি 8 ডিবাগ মিরর এপিআই পুরোপুরি এখানে উপযুক্ত।
বেনিয়ামিন গ্রুইনবাউম

এবং .. DeprecationWarning: DebugContext has been deprecated and will be removed in a future version.:( দেখে মনে হচ্ছে ভি 8 এটি মুছে ফেলেছে
বেনজমিন গ্রুইনবাউম

আমরা (নোড) সম্পূর্ণরূপে একটি ভিআইআই এর কাছে একটি এপিআই চাইতে চাইতে পারি বা কোনও প্রতিশ্রুতির রাজ্য দেখার জন্য সরাসরি কোনও API প্রকাশ করতে পারি যদিও আপনি যদি github.com/nodejs/promise-use-cases এ কোনও সমস্যা খোলেন আমি খুশিভাবে V8 এর সাথে তুলে আনব
বেনজামিন গ্রুয়েনবাউম

1
এই বিষয়ে একটি মন্তব্য আরও নিচে প্রকাশ একটি API ইতিমধ্যে বিদ্যমান প্রদর্শিত হবে যে: process.binding('util').getPromiseDetails( promise )আয় [ 0, ]মুলতুবী জন্য, [ 1, value ]পূর্ণ জন্য, এবং [ 2, value ]প্রত্যাখ্যাত জন্য।
ম্যাথিজরা

3

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

নোডে আপনি সিঙ্ক্রোনলি ব্যবহার করে কোনও প্রতিশ্রুতির রাজ্য নির্ধারণ করতে পারেন process.binding('util').getPromiseDetails(/* promise */);

এটি ফিরে আসবে:

[0, ] মুলতুবি জন্য,

[1, /* value */] পূরণের জন্য, বা

[2, /* value */] প্রত্যাখ্যাত জন্য।

const pending = new Promise(resolve => setTimeout(() => resolve('yakko')));;
const fulfilled = Promise.resolve('wakko');
const rejected = Promise.reject('dot');

[pending, fulfilled, rejected].forEach(promise => {
  console.log(process.binding('util').getPromiseDetails(promise));
});

// pending:   [0, ]
// fulfilled: [1, 'wakko']
// rejected:  [2, 'dot']

এটি কোনও সহায়ক ফাংশনে মোড়ানো:

const getStatus = promise => ['pending', 'fulfilled', 'rejected'][
  process.binding('util').getPromiseDetails(promise)[0]
];

getStatus(pending); // pending
getStatus(fulfilled); // fulfilled
getStatus(rejected); // rejected

মনে হয় না এর মধ্যে থেকে কাজ করা jest(যা কেবলমাত্র এটিতে আমি আগ্রহী, এটিই কেবল)। ফাংশনটি বিদ্যমান, তবে সর্বদা ফিরে আসবে বলে মনে হয় undefined। আমি কীভাবে ভুল করব তা আবিষ্কার করব?
অ্যাডাম বার্নেস

হুম, মনে আছে এটির মধ্যে কাজ করছে mocha; jestযদিও এটি দিয়ে চেষ্টা কখনও । সম্ভবত এখানে একটি নতুন প্রশ্ন সংযোগ শুরু করুন এবং আপনার নোড.জেএস সংস্করণ পাশাপাশি jestসংস্করণ অন্তর্ভুক্ত করবেন?
স্কট রুডিগার

দুর্ভাগ্যক্রমে, আমি আর কোনও বড় বিষয়ে আগ্রহী এমন কিছু নয়। আমি মূলত আমার ম্যানুয়ালি রেজলিউজেবল / রিজেক্টযোগ্য পরীক্ষা-নিরীক্ষার দিকে তাকিয়ে ছিলাম Promiseযে আমি কেবল যে জিনিসগুলি একটি Promiseমুলতুবি থাকা অবস্থায় চলতে হবে তা পরীক্ষা করার জন্য ব্যবহার করছিলাম, তবে আমি যতটা লিখেছি, কাজ করে, তার পরে পরীক্ষার দরকার নেই এটিতে কি নির্ভর করে তা ছাড়াও।
অ্যাডাম বার্নেস

2

আপনি যা করতে পারেন তা হল স্টোর সংরক্ষণের জন্য একটি ভেরিয়েবল ব্যবহার করা, ম্যানুয়ালি সেই স্থানে রাষ্ট্রটি সেট করা এবং সেই ভেরিয়েবলটি পরীক্ষা করা।

var state = 'pending';

new Promise(function(ff, rjc) {
  //do something async

  if () {//if success
    state = 'resolved';

    ff();//
  } else {
    state = 'rejected';

    rjc();
  }
});

console.log(state);//check the state somewhere else in the code

অবশ্যই, এর অর্থ আপনার প্রতিশ্রুতির মূল কোডটিতে অ্যাক্সেস থাকতে হবে। যদি আপনি না করেন তবে আপনি এটি করতে পারেন:

var state = 'pending';

//you can't access somePromise's code
somePromise.then(function(){
  state = 'resolved';
}, function() {
  state = 'rejected';
})

console.log(state);//check the promise's state somewhere else in the code

আমার সমাধানটি আরও কোডিং, তবে আমি মনে করি আপনি প্রতিটা প্রতিশ্রুতি ব্যবহার করার জন্য আপনাকে সম্ভবত এটি করতে হবে না।


2

নোড.জেএস সংস্করণ 8 অনুসারে, আপনি এখন দেশীয় প্রতিশ্রুতিগুলি (কোনও বিপজ্জনক হ্যাক ছাড়াই) সিঙ্ক্রোনালি পরিদর্শন করতে বুদ্ধিমান-পরিদর্শন প্যাকেজটি ব্যবহার করতে পারেন ।


2

আপনি প্রতিশ্রুতি.প্রোটোটাইপ একটি পদ্ধতি যুক্ত করতে পারেন। দেখে মনে হচ্ছে:

সম্পাদিত: প্রথম সমাধানটি এখানে বেশিরভাগ উত্তরের মতো সঠিকভাবে কাজ করছে না। এটি অ্যাসিক্রোনাস ফাংশন অবধি "মুলতুবি" ফিরিয়ে দেয় ".তখন" প্রার্থনা করা হয়, যা তাৎক্ষণিকভাবে ঘটে না। (একই কথা Promise.race ব্যবহার করে সমাধানগুলি সম্পর্কে)। আমার দ্বিতীয় সমাধানটি এই সমস্যার সমাধান করে।

if (window.Promise) {
    Promise.prototype.getState = function () {
        if (!this.state) {
            this.state = "pending";
            var that = this;
            this.then(
                function (v) {
                    that.state = "resolved";
                    return v;
                },
                function (e) {
                    that.state = "rejected";
                    return e;
                });
        }
        return this.state;
    };
}

আপনি এটি কোনও প্রতিশ্রুতিতে ব্যবহার করতে পারেন। উদাহরণ স্বরূপ:

myPromise = new Promise(myFunction);
console.log(myPromise.getState()); // pending|resolved|rejected

দ্বিতীয় (এবং সঠিক) সমাধান:

if (window.Promise) {
    Promise.stateable = function (func) {
        var state = "pending";
        var pending = true;
        var newPromise = new Promise(wrapper);
        newPromise.state = state;
        return newPromise;
        function wrapper(resolve, reject) {
            func(res, rej);
            function res(e) {
                resolve(e);
                if (pending) {
                    if (newPromise)
                        newPromise.state = "resolved";
                    else
                        state = "resolved";
                    pending = false;
                }
            }
            function rej(e) {
                reject(e);
                if (pending) {
                    if (newPromise)
                        newPromise.state = "rejected";
                    else
                        state = "rejected";
                    pending = false;
                }
            }
        }
    };
}

এবং এটি ব্যবহার করুন:

বিজ্ঞপ্তি : এই সমাধানে আপনাকে "নতুন" অপারেটর ব্যবহার করতে হবে না।

myPromise = Promise.stateable(myFunction);
console.log(myPromise.state); // pending|resolved|rejected

1

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

const PROMISE = Symbol('PROMISE')
const tap = fn => x => (fn(x), x)
const trace = label => tap(x => console.log(label, x))

class QueryablePromise {
  resolved = false
  rejected = false
  fulfilled = false
  catchFns = []
  constructor(fn) {
    this[PROMISE] = new Promise(fn)
      .then(tap(() => {
        this.fulfilled = true
        this.resolved = true
      }))
      .catch(x => {
        this.fulfilled = true
        this.rejected = true
        return Promise.reject(x)
      })
  }
  then(fn) {
    this[PROMISE].then(fn)
    return this
  }
  catch(fn) {
    this[PROMISE].catch(fn)
    return this
  }
  static resolve(x) {
    return new QueryablePromise((res) => res(x))
  }
  static reject(x) {
    return new QueryablePromise((_, rej) => rej(x))
  }
}

const resolvedPromise = new QueryablePromise((res) => {
  setTimeout(res, 200, 'resolvedPromise')
})

const rejectedPromise = new QueryablePromise((_, rej) => {
  setTimeout(rej, 200, 'rejectedPromise')
})

// ensure our promises have not been fulfilled
console.log('test 1 before: is resolved', resolvedPromise.resolved)
console.log('test 2 before: is rejected', rejectedPromise.rejected)


setTimeout(() => {
  // check to see the resolved status of our promise
  console.log('test 1 after: is resolved', resolvedPromise.resolved)
  console.log('test 2 after: is rejected', rejectedPromise.rejected)
}, 300)

// make sure we can immediately resolve a QueryablePromise
const immediatelyResolvedPromise = QueryablePromise.resolve('immediatelyResolvedPromise')
  // ensure we can chain then
  .then(trace('test 3 resolved'))
  .then(trace('test 3 resolved 2'))
  .catch(trace('test 3 rejected'))

// make sure we can immediately reject a QueryablePromise
const immediatelyRejectedPromise = QueryablePromise.reject('immediatelyRejectedPromise')
  .then(trace('test 4 resolved'))
  .catch(trace('test 4 rejected'))
<script src="https://codepen.io/synthet1c/pen/KyQQmL.js"></script>


1

awaitঅডিওবাদী প্রোটোটাইপিং সহ @ জিবের উত্তরের ব্যবহার ।

Object.defineProperty(Promise.prototype, "state", {
    get: function(){
        const o = {};
        return Promise.race([this, o]).then(
            v => v === o ? "pending" : "resolved",
            () => "rejected");
    }
});

// usage: console.log(await <Your Promise>.state);
(async () => {
    console.log(await Promise.resolve(2).state);  // "resolved"
    console.log(await Promise.reject(0).state);   // "rejected"
    console.log(await new Promise(()=>{}).state); // "pending"
})();

নোট করুন যে এই অ্যাসিঙ্ক ফাংশনটি সিঙ্কড ফাংশনটির মতো "প্রায়" তত্ক্ষণাত্ কার্যকর করে (অথবা আসলে সম্ভবত তাত্ক্ষণিকভাবে হতে পারে)।


1

2019:

আমি জানি যে কাজটি করার সহজ উপায় হ'ল thenableপ্রতিশ্রুতি বা কোনও অ্যাসিঙ্ক চাকরির চারপাশে সুপার পাতলা মোড়ক।

const sleep = (t) => new Promise(res => setTimeout(res,t));
const sleeping = sleep(30);

function track(promise){
    let state = 'pending';
    promise = promise.finally( _=> state ='fulfilled');
    return {
        get state(){return state},
        then: promise.then.bind(promise), /*thentable*/
        finally:promise.finally.bind(promise),
        catch:promise.catch.bind(promise),
    }
}


promise = track(sleeping);
console.log(promise.state) // pending

promise.then(function(){
    console.log(promise.state); // fulfilled
})

1

আপনি করতে পারেন extendপ্রতিশ্রুতি বর্গ একটি নতুন তৈরি করতে queryable প্রতিশ্রুতি বর্গ।

আপনি আপনার নিজের উপশ্রেণী তৈরি করতে পারেন, বলতে QueryablePromiseনেটিভ প্রাপ্তিসাধ্য থেকে inheriting দ্বারা, Promiseবর্গ, যার দৃষ্টান্ত একটি হবে statusসম্পত্তি এটি উপলব্ধ যে আপনি বস্তু প্রতিশ্রুতি অবস্থা অনুসন্ধান করতে ব্যবহার করতে পারেন সিঙ্ক্রোনাস । এটি একটি বাস্তবায়ন অথবা নীচের দেখা যায় পড়ুন এই একটি ভাল ব্যাখ্যা জন্য।

class QueryablePromise extends Promise {
  constructor (executor) {
    super((resolve, reject) => executor(
      data => {
        resolve(data)
        this._status = 'Resolved'
      },
      err => {
        reject(err)
        this._status = 'Rejected'
      },
    ))
    this._status = 'Pending'
  }

  get status () {
    return this._status
  }
}
 
// Create a promise that resolves after 5 sec 
var myQueryablePromise = new QueryablePromise((resolve, reject) => {
  setTimeout(() => resolve(), 5000)
})

// Log the status of the above promise every 500ms
setInterval(() => {
  console.log(myQueryablePromise.status)
}, 500)


দুর্ভাগ্যক্রমে, কোনও বিদ্যমান এপিআই এই নতুন ক্লাসটি ফিরিয়ে দেবে না। আপনি কীভাবে কল্পনা করছেন লোকেরা এটি ব্যবহার করছেন?
jib

@ জিব আপনার প্রতিক্রিয়া জন্য ধন্যবাদ। আপনি কী বোঝাতে চেয়েছেন যে কোনও এপিআই এই শ্রেণিটি ফিরিয়ে দেবে না? :(
উত্সর্প প্রমোদগুপ্ত

কোনও বিদ্যমান API গুলি এটিকে ফেরত দেবে না, কারণ এটি ফেরত পাঠানোর জন্য তাদের লিখতে হবে, তাই না? যেমন আমি যদি fetchএটি কল করি তবে একটি স্থানীয় প্রতিশ্রুতি ফিরে আসবে। আপনার ক্লাসটি কীভাবে এতে সহায়তা করবে?
jib

ভাল, আমরা ঠিক সেই মতো আমাদের নতুন QuerablePromise কল আনা মোড়ানো পারে না: const queryableFetch = new QueryablePromise((resolve, reject) => {fetch(/.../).then((data) => resolve(data)) })? বা, সেখানে কি কোনও সমস্যা আছে? : /
উত্কর্ষপ্রমোদগুপ্ত

এটি কাজ করা উচিত, কেবল , err => reject(err)দ্বিতীয় আর্গ হিসাবে ভুলে thenযাবেন না বা এটি ত্রুটিগুলি সঠিকভাবে প্রচার করবে না (যে কারণগুলির মধ্যে এটি প্রতিশ্রুতিবদ্ধ কনস্ট্রাক্টরকে অ্যান্টি-প্যাটার্ন হিসাবে বিবেচনা করে )। যদিও এটি সত্যিকারের সিঙ্ক্রোনাস নয় (যেমন ইতিমধ্যে সমাধান হওয়া প্রতিশ্রুতি সনাক্ত করতে পারে না) তবে আপনি সম্ভবত কলারকে নিয়ন্ত্রণ করেন না এবং তত্ক্ষণাত উত্তর প্রয়োজন হবে এমন ক্ষেত্রে দরকারী।
jib

1

অন্য এর মার্জিত পরীক্ষণ যদি একটি প্রতিশ্রুতি এখনো স্ট্রিং পুরো বস্তুর রূপান্তর দ্বারা শুধু মুলতুবী এবং এই মত পরিদর্শন সাহায্যে এটি পরীক্ষা করা হয় & হল hacky উপায়: util.inspect(myPromise).includes("pending")

নোড.জেএস 8,9,10,11,12,13 এ পরীক্ষিত

এখানে একটি সম্পূর্ণ উদাহরণ

const util = require("util")

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

(async ()=>{
  let letmesleep = sleep(3000)
  setInterval(()=>{
    console.log(util.inspect(letmesleep).includes("pending"))
  },1000)
})()

ফলাফল:

true
true
false
false
false

0

আপনি যদি ES7 পরীক্ষামূলক ব্যবহার করে থাকেন তবে আপনি যে প্রতিশ্রুতিটি শুনতে চান তা সহজেই গুটিয়ে রাখতে আপনি async ব্যবহার করতে পারেন।

async function getClient() {
  let client, resolved = false;
  try {
    client = await new Promise((resolve, reject) => {
      let client = new Client();

      let timer = setTimeout(() => {
         reject(new Error(`timeout`, 1000));
         client.close();
      });

      client.on('ready', () => {
        if(!resolved) {
          clearTimeout(timer);
          resolve(client);
        }
      });

      client.on('error', (error) => {
        if(!resolved) {
          clearTimeout(timer);
          reject(error);
        }
      });

      client.on('close', (hadError) => {
        if(!resolved && !hadError) {
          clearTimeout(timer);
          reject(new Error("close"));
        }
      });
    });

    resolved = true;
  } catch(error) {
    resolved = true;
    throw error;
  }
  return client;
}

0

আমি একটি ছোট এনপিএম প্যাকেজ লিখেছি, প্রতিশ্রুতি-মান, যা একটি সঙ্গে একটি প্রতিশ্রুতি আবরণ সরবরাহ করে resolved পতাকা :

https://www.npmjs.com/package/promise-value

এটি প্রতিশ্রুতি মানের (বা ত্রুটি) সিঙ্ক্রোনাস অ্যাক্সেসও দেয়। প্যাটার্ন প্রসারিত করার পরিবর্তে মোড়কে অনুসরণ করে প্রতিশ্রুতি বস্তুটি নিজেই পরিবর্তিত হয় না।


0

এটি পুরানো প্রশ্ন তবে আমি অনুরূপ কিছু করার চেষ্টা করছিলাম। আমার এন কর্মীদের চালিয়ে যাওয়া দরকার। তারা একটি প্রতিশ্রুতি কাঠামোগত হয়। আমাকে স্ক্যান করে দেখতে হবে এবং সেগুলি সমাধান করা, প্রত্যাখ্যান করা বা এখনও মুলতুবি রয়েছে কিনা। যদি সমাধান করা হয় তবে আমার মানটি দরকার, যদি সমস্যাটি সমাধান করতে বা মুলতুবি করতে অস্বীকৃত হয় তবে কিছু করতে হবে। সমাধান করা বা বাতিল হলে আমার চালিয়ে যাওয়া চালিয়ে যাওয়ার জন্য অন্য একটি কাজ শুরু করা দরকার। আমি প্রতিশ্রুতিগুলিকে একটি অ্যারে রেখে কাজ করে রাখি এবং সেগুলি মোছার কোনও উপায় খুঁজে না পাওয়ায় আমি প্রতিশ্রুতি.ল বা প্রতিশ্রুতি.রেস দিয়ে এটি করার কোনও উপায় অনুমান করতে পারি না। সুতরাং আমি এমন কর্মী তৈরি করি যা চালাকি করে

আমার একটি প্রতিশ্রুতি জেনারেটর ফাংশন দরকার যা একটি প্রতিশ্রুতি দেয় যা প্রয়োজনীয় হিসাবে সমাধান বা প্রত্যাখ্যান করে। এটিকে এমন একটি ফাংশন দ্বারা ডাকা হয় যা প্রতিশ্রুতিটি কী করছে তা জানার জন্য কাঠামো সেট আপ করে।

নীচের কোডে জেনারেটর কেবল সেটটাইমআউট এর উপর ভিত্তি করে একটি প্রতিশ্রুতি দেয়।

এটা এখানে

//argObj should be of form
// {succeed: <true or false, nTimer: <desired time out>}
function promiseGenerator(argsObj) {
  let succeed = argsObj.succeed;          
  let nTimer = argsObj.nTimer;
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (succeed) {
        resolve('ok');
      }
      else {
        reject(`fail`);
      }
    }, nTimer);
  })

}

function doWork(generatorargs) {
  let sp = { state: `pending`, value: ``, promise: "" };
  let p1 = promiseGenerator(generatorargs)
    .then((value) => {
      sp.state = "resolved";
      sp.value = value;
    })
    .catch((err) => {
      sp.state = "rejected";
      sp.value = err;
    })
  sp.promise = p1;
  return sp;
}

doWork প্রতিশ্রুতি এবং তার রাজ্য এবং প্রত্যাশিত মান সম্বলিত একটি বস্তু প্রদান করে।

নিম্নলিখিত কোডটি একটি লুপ চালায় যা রাজ্যের পরীক্ষা করে এবং এটি 3 চালক কর্মী রাখতে নতুন কর্মী তৈরি করে।

let promiseArray = [];

promiseArray.push(doWork({ succeed: true, nTimer: 1000 }));
promiseArray.push(doWork({ succeed: true, nTimer: 500 }));
promiseArray.push(doWork({ succeed: false, nTimer: 3000 }));

function loopTimerPromise(delay) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve('ok');
    }, delay)
  })
}

async function looper() {
  let nPromises = 3;      //just for breaking loop
  let nloop = 0;          //just for breaking loop
  let i;
  //let continueLoop = true;
  while (true) {
    await loopTimerPromise(900);  //execute loop every 900ms
    nloop++;
    //console.log(`promiseArray.length = ${promiseArray.length}`);
    for (i = promiseArray.length; i--; i > -1) {
      console.log(`index ${i} state: ${promiseArray[i].state}`);
      switch (promiseArray[i].state) {
        case "pending":
          break;
        case "resolved":
          nPromises++;
          promiseArray.splice(i, 1);
          promiseArray.push(doWork({ succeed: true, nTimer: 1000 }));
          break;
        case "rejected":
          //take recovery action
          nPromises++;
          promiseArray.splice(i, 1);
          promiseArray.push(doWork({ succeed: false, nTimer: 500 }));
          break;
        default:
          console.log(`error bad state in i=${i} state:${promiseArray[i].state} `)
          break;
      }
    }
    console.log(``);
    if (nloop > 10 || nPromises > 10) {
      //should do a Promise.all on remaining promises to clean them up but not for test
      break;
    }
  }
}

looper();

নোড.জেজে পরীক্ষিত

বিটিডব্লিউ এই উত্তরে এতটা নয় তবে অন্যদের মতো একই বিষয়ে, আমি যখন ঘৃণা করি তখন কেউ বলে "আপনি বুঝতে পারবেন না" বা "এটি কীভাবে কাজ করে না" আমি সাধারণভাবে ধরেই নিয়েছি প্রশ্নকর্তা জানেন তারা কী চায়। একটি ভাল উপায় প্রস্তাব দুর্দান্ত। কীভাবে প্রতিশ্রুতি দেওয়া কাজ করা ভাল তাও রোগীর ব্যাখ্যা।


-1

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

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

/**
 * This function allow you to modify a JS Promise by adding some status properties.
 * Based on: http://stackoverflow.com/questions/21485545/is-there-a-way-to-tell-if-an-es6-promise-is-fulfilled-rejected-resolved
 * But modified according to the specs of promises : https://promisesaplus.com/
 */
function MakeQuerablePromise(promise) {
    // Don't modify any promise that has been already modified.
    if (promise.isFulfilled) return promise;

    // Set initial state
    var isPending = true;
    var isRejected = false;
    var isFulfilled = false;

    // Observe the promise, saving the fulfillment in a closure scope.
    var result = promise.then(
        function(v) {
            isFulfilled = true;
            isPending = false;
            return v; 
        }, 
        function(e) {
            isRejected = true;
            isPending = false;
            throw e; 
        }
    );

    result.isFulfilled = function() { return isFulfilled; };
    result.isPending = function() { return isPending; };
    result.isRejected = function() { return isRejected; };
    return result;
}

wrappedPromise = MakeQueryablePromise(Promise.resolve(3)); 
setTimeout(function() {console.log(wrappedPromise.isFulfilled())}, 1);

Https://ourcodeworld.com/articles/read/317/how-to-check-if-a- javascript- promise- has- been- fulfilled- rejected- or- resused থেকে যা তাদের উত্তরটির উপর ভিত্তি করে সমাধান করার উপায় আছে কি? কোন ES6 প্রতিশ্রুতি পূরণ / প্রত্যাখ্যান / সমাধান করা হয়েছে তা বলুন?


আমার উত্তর সম্পর্কে আপনার মন্তব্যে যেমন যোগ করা হয়েছে - এটি সম্পূর্ণরূপে ভুল: এটি আপনাকে প্রতিশ্রুতিবদ্ধ স্থিতির সাথে একযোগে পরীক্ষা করতে দেয় না - উদাহরণস্বরূপ MakeQueryablePromise(Promise.resolve(3)).isResolvedমিথ্যা হলেও প্রতিশ্রুতিটি বেশ স্পষ্টতই সমাধান হয়েছে। উত্তরটি উল্লেখ না করে "সমাধান করা" এবং "পরিপূর্ণ" শব্দটিও ভুলভাবে ব্যবহার করা হচ্ছে। এই উত্তরটি করার জন্য আপনি .thenনিজেই কোনও হ্যান্ডলার যুক্ত করতে পারেন - যা সিঙ্ক্রোনাস ইন্সপেক্টের বিন্দুটিকে পুরোপুরি মিস করে।
বেনজামিন গ্রুয়েনবাউম

আমি দেখতে পাচ্ছি আপনি কী বলছেন এবং আপনি একটি ভাল বক্তব্য রেখেছেন। জেএসের একক থ্রেডেড প্রকৃতি যেভাবে পাচ্ছে তা তাই না? সমাধান হিসাবে চিহ্নিত হিসাবে প্রতিশ্রুতি জন্য আপনি বর্তমান মৃত্যুদন্ডের একটি বিরতি রাখতে হবে। let wrappedPromise = MakeQueryablePromise(Promise.resolve(3)); setTimeout(function() {console.log(wrappedPromise.isFulfilled())}, 1);যা যতক্ষণ আপনি এটি করেন, এটি দুর্দান্তভাবে কাজ করে। তবে এটি কার্যকর হওয়ার জন্য আপনাকে সেই সত্যটি বুঝতে হবে। আমি সেই ক্যাভিয়েট দিয়ে বর্ণনাটি আপডেট করব। আমিও সম্মত হই যে ফাংশনটির নামকরণ আরও ভাল / আরও মূ .় হতে পারে।
আকরিকোস

তবে সেই মুহুর্তে আপনি কেবলমাত্র thenমূল প্রতিশ্রুতি দিতে এবং একই জিনিসটি সম্পাদন করতে পারেন যেহেতু এটি অ্যাসিঙ্ক্রোনাস any process.binding('util').getPromiseDetailsএটির সাথে কাজ করার মতো একটি উপায় রয়েছে তবে এটি একটি বেসরকারী এপিআই ব্যবহার করছে
বেনজামিন গ্রুয়েনবাউম

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