it-swarm.asia

كيف تصل إلى قيمة الوعد؟

أنا أبحث في هذا المثال من مستندات Angular الخاصة بـ $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"؟ انا مشتاق لشيئ ما.

97
temporary_user_name

ترجع الدالة promiseA's then وعدًا جديدًا (promiseB) يتم حله فورًا بعد حل promiseA ، قيمته هي قيمة ما يتم إرجاعه من دالة النجاح داخل promiseA.

في هذه الحالة ، يتم حل promiseA بقيمة - result ومن ثم يحل على الفور promiseB بقيمة result + 1.

يتم الوصول إلى قيمة promiseB بنفس الطريقة التي وصلنا بها إلى نتيجة promiseA.

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

عندما يتم حل/رفض الوعد ، سوف يطلق عليه معالج النجاح/الخطأ:

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

ترجع الطريقة then أيضًا وعدًا: promB ، والذي سيتم حله/رفضه اعتمادًا على قيمة الإرجاع من معالج النجاح/الخطأ من الوعدA .

هناك ثلاث قيم محتملة يمكن أن يعيدها مُعالجو النجاح/الخطأ والتي ستؤثر على نتائج وعد:

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

إرجاع المكالمة ثم promB فورًا. عندما يتم حل proma ، سيتم تمرير النتيجة إلى معالج نجاح proma. نظرًا لأن قيمة الإرجاع هي نتيجة وعد + 1 ، يقوم معالج النجاح بإرجاع قيمة (الخيار 2 أعلاه) ، لذلك سوف يتم حل الوعد B فورًا ، وسيتم تمرير معالج نجاح الوعد B نتيجة الوعد + 1.

16
pixelbits

.then وظيفة الوعد B تتلقى ما يتم إرجاعه من .then ظيفة الوعد.

هنا proma سيعود هو رقم ، والذي سيكون متاحًا كمعلمة number في وظيفة النجاح من promB. والتي سيتم بعد ذلك زيادة بنسبة 1

2
harishr

قد يساعد تحليل التعليق بشكل مختلف قليلاً عن فهمك الحالي:

// 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
});
1
Jason Cust

يمكنك القيام بذلك بسهولة باستخدام طريقة انتظار غير متزامن في javascript.

يوجد أدناه مثال لاسترداد قيمة وعد WebRTC باستخدام مهلة.

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
OxFEEDFACE

إجابة pixelbits صحيحة ويجب عليك دائمًا استخدام .then() للوصول إلى قيمة الوعد في رمز الإنتاج.

ومع ذلك ، هناك طريقة للوصول إلى قيمة الوعد مباشرة بعد حلها باستخدام ربط node.js الداخلي التالي غير المدعوم:

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

تحذير: عملية. لم يكن القصد من أي وقت مضى أن تستخدم خارج nodejs الأساسية وفريق nodejs الأساسي يبحث بنشاط لإسقاطه

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

0
Zeus Lalkaka
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
}
0
tomnyson

هذا المثال أجد النفس. لاحظ كيف تنتظر النتيجة حتى تفوتك وعدًا بالرجوع.

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
Master James