2017-05-10 6 views
12

मैं इस तरह एक समारोह है:वादे के अंदर वादा: बच्चे के वादे से परिवर्तनीय वापस करने का सही तरीका क्या है? (जे एस)

function top() { 

    //promise1 
    ParentPromise({ 
    ...some code here... 
    }).then(function() { 


    //promise2 
     ChildPromise({ 
      ..some code here... 
     }).then(function(response) { 
     var result = response.result.items; 

     }); 

}); 

}; 

और मैं इस तरह से परिणाम मान देने के लिए की जरूरत है:

var myresult = start(); 

मैं ऐसा कैसे कर सकता है? THX

+0

कैसे 'top' से संबंधित' start' है:

function top() { ... return ParentPromie; } var myresult = ''; // default value until you have resolved your promise top().then(result => myresult = result); 

बहरहाल, यह काम करने के लिए, आप कोड जोड़ने के लिए अपने वादे को हल करने की आवश्यकता होगी? क्या आप 'परिणाम' को हल करने के लिए 'ParentPromise' को हल करना चाहते हैं? –

+0

यह एक Google एपीआई कॉल है। "वापसी परिणाम" पाने का कोई तरीका मौजूद है? मुझे नहीं पता, एक वैश्विक चर –

+0

संभावित संभावित डुप्लिकेट [वादा के साथ पूर्व परिणाम कैसे साझा करें और साझा करें] (http://stackoverflow.com/questions/28714298/how-to-chain-and-share-prior- परिणाम-साथ-वादे) – Erazihel

उत्तर

7

वादों की परिभाषा है कि आप सचमुच myresult करने के लिए result असाइन नहीं कर सकते है। हालांकि, आप myresult को एक ऐसा वादा कर सकते हैं जो कॉलर के लिए सीधे result पर हल हो जाता है, हालांकि इसे प्राप्त करने के लिए कई वादों का उपयोग किया जाता था। मूल विचार यह है कि आपके उपरोक्त ब्लॉक में प्रत्येक फ़ंक्शन के अंदर, आपको श्रृंखला में अगले वादे में return होना चाहिए। उदाहरण के लिए:

function top() { 

    //promise1 
    return ParentPromise({ 
    ...some code here... 
    }).then(function() { 


    //promise2 
     return ChildPromise({ 
      ..some code here... 
     }).then(function(response) { 
     var result = response.result.items; 
     return result; 

     }); 

}); 

}; 

अंत में, कोड बुला top() जानते हैं या परवाह है कि 1, 2, या 12 श्रृंखलित वादों result प्राप्त करने के लिए इस्तेमाल किया गया नहीं होंगे। यदि इनमें से कोई भी वादा विफल हो गया है तो यह एक त्रुटि कॉलबैक पंजीकृत भी कर पाएगा।

+0

ठीक है मैं समझता हूं, अब मुझे कंसोल में [ऑब्जेक्ट ऑब्जेक्ट] मिलता है। मैं सही परिणाम कैसे प्रिंट कर सकता हूं? –

+0

@ValerioMarzulli मुझे यकीन नहीं है कि आपकी उदाहरण कोड में console.log() क्यों नहीं है, इसलिए मुझे निश्चित रूप से पता नहीं है कि आप परिणाम को पुनर्प्राप्त/उपयोग करने का इरादा रखते हैं। लेकिन, एक उदाहरण होगा: 'शीर्ष()। (फ़ंक्शन (परिणाम) {console.log (परिणाम);} '। पूछने से पहले, नहीं, आपको उसी फ़ंक्शन कॉल के दौरान' परिणाम 'नहीं मिल सकता है - यही कारण है कि हमारे पास वादे और कॉलबैक हैं। – Katana314

+0

ने इसे प्राप्त किया, आपके समय के लिए धन्यवाद! –

4

यह सुनिश्चित नहीं है कि यह मूल जेएस वादों के साथ काम करेगा, लेकिन PromiseKit (तेज़ .. मुझे पता है, लेकिन मुझे पूरा यकीन है कि यह काम करना चाहिए) मैं दूसरे वादे को वापस करने के लिए उपयोग किया जाता हूं, और इसे चेन करता हूं इस तरह:

function top() { 
    //promise1 
    return ParentPromise({ 
    ...some code here... 
    }).then(function() { 
    //promise2 
    return ChildPromise({ 
      ..some code here... 
    }) 
    }).then(function(response) { 
    var result = response.result.items; 

    }); 
} 

top().then(function(){ 
    // all done 
}); 
+0

हां, जावास्क्रिप्ट वादा इस तरह से काम करता है। आईएमएचओ, आपका सबसे अच्छा समाधान है। – falsarella

-1

यहां चुनौती यह है कि आप एक तुल्यकालिक तरीके से एसिंक्रोनस कोड का उपयोग करने की कोशिश कर रहे हैं। एसिंक्रोनस कोड के साथ काम करते समय आपको सोचने के तरीके को बदलने की आवश्यकता होगी।

इसे हल करने का एक तरीका शीर्ष() पेरेंटप्रोमेज़ लौटा रहा है, और उसके बाद उस वचन की वापसी के .the() का उपयोग कर परिवर्तनीय myresult सेट करें।

var ParentPromise = new Promise(function(resolve) { 
    ... some code... 
    var ChildPromise = new Promise(function(){ 
    ...some code... 
    }).then(function(response){ 
    resolve(response.result.items); 
    }); 
}); 
+0

इसका मतलब है कि बाल वादा हल नहीं होगा, इसलिए इसके बाद भी बुलाया नहीं जाएगा, इसलिए माता-पिता का वादा भी हल नहीं होगा, अग्रणी 2 लंबित वादे की स्मृति रिसाव के लिए। – falsarella

संबंधित मुद्दे