নতুন প্রতিশ্রুতি বনাম প্রতিশ্রুতি। সমাধান (সমাধান)


98

আমি ব্লুবার্ড ব্যবহার করছি এবং প্রতিশ্রুতিতে সিঙ্ক্রোনাস ফাংশনগুলি সমাধান করার জন্য আমি দুটি উপায় দেখতে পাচ্ছি, তবে আমি উভয় পদ্ধতির মধ্যে পার্থক্য পাই না। দেখে মনে হচ্ছে স্ট্যাকট্রেসটি কিছুটা আলাদা, তাই তারা ঠিক একটি alias, তাই না ?

সুতরাং পছন্দসই উপায় কি?

ওয়ে ক

function someFunction(someObject) {
  return new Promise(function(resolve) {
    someObject.resolved = true;
    resolve(someObject);
  });
}

ওয়ে বি

function someFunction(someObject) {
  someObject.resolved = true;
  return Promise.resolve(someObject);
}

4
Promise.resolveশুধু চিনি।
কোয়ান্টাস 94 ভারী

4
সংক্ষিপ্ত উত্তর - ব্যবহারে কোনও পার্থক্য নেই। শুধু চিনি।
পিনাল

@ পিনাল "চিনি" কী?
ডাবলআর্ট

6
@ টৌরাস সিনট্যাকটিক চিনির জিনিসগুলি পড়া বা প্রকাশ করা সহজ করার জন্য ডিজাইন করা সিনট্যাকটিক চিনি । দেখুন: উইকিপিডিয়া
উইক

উত্তর:


85

মন্তব্যে উভয় উত্তরের বিপরীতে - একটি পার্থক্য রয়েছে।

যখন

Promise.resolve(x);

মূলত একই

new Promise(function(r){ r(x); });

একটি সূক্ষ্মতা আছে।

প্রতিশ্রুতি ফিরিয়ে দেওয়ার ক্রিয়াকলাপগুলির সাধারণত গ্যারান্টি থাকতে হবে যে তারা সিঙ্ক্রোনালি নিক্ষেপ করবে না কারণ তারা অ্যাসিঙ্ক্রোনাসলি ফেলে দিতে পারে। অপ্রত্যাশিত ফলাফল এবং প্রতিযোগিতার পরিস্থিতি রোধ করার জন্য - নিক্ষেপগুলি সাধারণত প্রত্যাবর্তন প্রত্যাখাতে রূপান্তরিত হয়।

এটি মাথায় রেখে - যখন চশমাটি তৈরি করা হয়েছিল প্রতিশ্রুতিবদ্ধ কনস্ট্রাক্টর নিরাপদ নিক্ষেপ করা হবে।

যদি someObjectহয় undefined?

  • ওয়ে এ প্রত্যাখ্যাত প্রতিশ্রুতি ফিরিয়ে দেয়।
  • ওয়ে বি সিঙ্ক্রোনাসলি ছুড়ে ফেলে।

ব্লুবার্ড এটি দেখেছিল এবং পেটকা Promise.methodএই সমস্যাটির সমাধান করতে যুক্ত করেছে যাতে আপনি ফেরতের মানগুলি ব্যবহার করতে পারেন। সুতরাং ব্লুবার্ডে এটি লেখার সঠিক এবং সহজ উপায়টি আসলে কোনওটিই নয় - এটি হ'ল:

var someFunction = Promise.method(function someFunction(someObject){
    someObject.resolved = true;
    return someObject;
});

প্রতিশ্রুতি.মথদ্ধ আপনার জন্য সমাধানগুলিতে নিক্ষেপ করে এবং প্রত্যাবর্তনগুলিতে ফিরবে। এটি করা সবচেয়ে নিরাপদ উপায় এবং এটি thenরিটার্ন ভ্যালুগুলির মাধ্যমে সক্ষমগুলিকে অন্তর্ভুক্ত করে তাই এটি যদি someObjectবাস্তবে নিজেই প্রতিশ্রুতি দেয় তবে এটি কাজ করবে।

সাধারণভাবে, Promise.resolveপ্রতিশ্রুতিগুলিতে কাস্টিং অবজেক্ট এবং বিদেশী প্রতিশ্রুতি (তারপরেযোগ্য) ব্যবহার করা হয়। এটি এর ব্যবহারের ক্ষেত্রে।


"প্রতিশ্রুতি ফেরত ফাংশনগুলির সাধারণত গ্যারান্টি থাকতে হবে যে তারা একযোগে নিক্ষেপ করবে না যেহেতু তারা অবিচ্ছিন্নভাবে নিক্ষেপ করতে পারে"। ফাংশনগুলি উভয়ই সিঙ্ক্রোনাস বা অ্যাসিনক্রোনাস হওয়া উচিত তবে উভয়ই নয় এমনটি আপনি কী প্রসারিত করতে পারেন? বর্তমানে আমি Promise.resolve () উপভোগ করছি, আপনি কি এতদূর যেতে পারেন যে ব্যবহারটি Promise.resolve()একটি অ্যান্টি-প্যাটার্ন বলে?
অ্যাশলে কুলম্যান

4
@ অ্যাশলি কুলম্যান দেখুন blog.izs.me/post/59142742143/designing-apis- for- asynchrony - এমন একটি পদ্ধতি যা কখনও কখনও অবিচ্ছিন্নভাবে আচরণ করে অবিচ্ছিন্নতার জন্য সর্বদা এটি করা উচিত ।
বেনিয়ামিন গ্রুয়েনবাউম

না Promise.resolve()একটি নতুন দৃষ্টান্ত তৈরি Promiseব্যবহার একই ভাবে new? যদি তা না হয় return Promise.resolve(yourCode)তবে দ্রুত হবে এবং সিঙ্ক্রোনাস থ্রো এড়ানো হবে।
স্টিভেন ওয়াচন

4
আমার খারাপ লাগছে, আমি "Promise.resolve () ব্যবহার করি। তারপরে (ফাংশন () {/ * কেস যা কোনও ত্রুটি ছুঁড়ে ফেলতে পারে * /})। তারপরে ..." ত্রুটিটি প্রত্যাখ্যাত প্রতিশ্রুতিতে পরিণত হয়েছে তা নিশ্চিত হওয়ার জন্য ... আমি "প্রতিশ্রুতি.মাধ্যমিক"
পোলোপোলো

4
@ পোলোপোলো বা Promise.coroutineএটি আরও কার্যকর।
বেনজামিন গ্রুয়েনবাউম

18

উপরের উত্তর বা মন্তব্যে উল্লেখ না করে আরও একটি পার্থক্য রয়েছে:

যদি someObjectএকটি হয় Promise, new Promise(resolve)দুটি অতিরিক্ত টিক খরচ হবে।


নিম্নলিখিত দুটি কোড স্নিপেটের সাথে তুলনা করুন:

const p = new Promise(resovle => setTimeout(resovle));

new Promise(resolve => resolve(p)).then(() => {
  console.log("tick 3");
});

p.then(() => {
  console.log("tick 1");
}).then(() => {
  console.log("tick 2");
});

const p = new Promise(resovle => setTimeout(resovle));

Promise.resolve(p).then(() => {
  console.log("tick 3");
});

p.then(() => {
  console.log("tick 1");
}).then(() => {
  console.log("tick 2");
});

দ্বিতীয় স্নিপেট প্রথমে 'টিক 3' প্রিন্ট করবে। কেন?

  • মান যদি প্রতিশ্রুতি হয় Promise.resolve(value)তবে মানটি হুবহু ফিরে আসবে। Promise.resolve(value) === valueসত্য হবে। দেখুন MDN

  • কিন্তু new Promise(resolve => resolve(value))প্রতিশ্রুতি অনুসরণ করতে লকড থাকা একটি নতুন প্রতিশ্রুতি ফিরিয়ে দেবে value। এটি 'লকিং-ইন' করতে অতিরিক্ত একটি টিক প্রয়োজন।

    // something like:
    addToMicroTaskQueue(() => {
      p.then(() => {
        /* resolve newly promise */
      })
        // all subsequent .then on newly promise go on from here
        .then(() => {
          console.log("tick 3");
        });
    });
    

    tick 1 .thenকল প্রথমবার চালনার হবে।


তথ্যসূত্র:

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