Promise.resolve बनाम नया वादा (संकल्प)


92

मैं ब्लूबर्ड का उपयोग कर रहा हूं और मुझे दो तरीकों से समकालिक कार्यों को एक वादा में हल करने के लिए देखा जाता है, लेकिन मुझे दोनों तरीकों के बीच अंतर नहीं मिलता है। ऐसा लगता है कि स्टैकट्रेस थोड़ा अलग है, इसलिए वे सिर्फ एक नहीं हैंalias सही नहीं हैं?

तो पसंदीदा तरीका क्या है?

रास्ता ए

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

वे बी

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

2
Promise.resolveबस चीनी है
कांतास 94 हेवी

1
संक्षिप्त उत्तर - उपयोग में कोई अंतर नहीं। बस चीनी।
मीनल

@ मीनल "चीनी" क्या है?
डबलऑर्ट

5
@Taurus। सिंथेटिक शुगर को सिंटैक्स डिज़ाइन किया गया है जो चीजों को पढ़ने या व्यक्त करने में आसान बनाता है। देखें: विकिपीडिया
व्येक

जवाबों:


82

टिप्पणियों में दोनों उत्तरों के विपरीत - एक अंतर है।

जबकि

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

Promise.method फेंकता को अस्वीकार कर देगा और आपके लिए हल पर लौटेगा। यह ऐसा करने के लिए सबसे अधिक सुरक्षित तरीका है और यह thenएब्स को रिटर्न वैल्यू के माध्यम से आत्मसात करता है, भले ही यह काम करेsomeObject यह वास्तव में एक वादा हो।

सामान्य तौर पर, Promise.resolveवादों के लिए वस्तुओं और विदेशी वादों (तबेले) को कास्टिंग के लिए उपयोग किया जाता है। वह इसका उपयोग मामला है।


"वादा वापसी कार्यों में आम तौर पर गारंटी होनी चाहिए कि उन्हें सिंक्रोनाइज़ नहीं करना चाहिए क्योंकि वे एसिंक्रोनस रूप से फेंक सकते हैं"। क्या आप इस बात पर विस्तार कर सकते हैं कि फ़ंक्शंस समकालिक या अतुल्यकालिक क्यों नहीं होने चाहिए, लेकिन दोनों नहीं? वर्तमान में मैं Promise.resolve () का आनंद ले रहा हूं, तो क्या आप कहेंगे कि Promise.resolve()यह एक विरोधी पैटर्न है?
एशले कूलमैन

2
@AshleyCoolman ब्लॉग देखें .izs.me / post / 59142742143 / designing - apis - for - asynchrony - एक विधि जो कभी-कभी अतुल्यकालिक व्यवहार करती है उसे हमेशा संगति के लिए करना चाहिए ।
बेंजामिन Gruenbaum

करता है Promise.resolve()का एक नया उदाहरण बनाने Promiseका उपयोग कर के रूप में एक ही तरह से new? यदि नहीं, return Promise.resolve(yourCode)तो तेज होगा और तुल्यकालिक फेंकता से बचें।
स्टीवन वचोन

1
मुझे बुरा लगता है, मैं "Promise.resolve () का उपयोग करता हूं। फिर (फ़ंक्शन () {/ * मामला जो एक त्रुटि * /} को फेंक सकता है। फिर ..." यह सुनिश्चित करने के लिए कि त्रुटि एक अस्वीकृत वादा बन जाती है ... मैं "
Promise.method

1
@Polopollo या Promise.coroutineजो और भी अधिक उपयोगी है।
बेंजामिन ग्रुएनबाम

16

उपरोक्त उत्तरों या टिप्पणियों द्वारा उल्लेखित एक और अंतर नहीं है:

यदि 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कॉल पहले भाग जाता है।


संदर्भ:

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.