/ / पुनरावर्ती वादों के साथ setTimeout का उपयोग करना - नोड.जेएस, वादा

रिकर्सिव वादे के साथ setTimeout का उपयोग करना - node.js, वादा

मेरे पास निम्न कोड है जो इथेरियम ब्लॉकचेन पर खनन करने के लिए लेनदेन की प्रतीक्षा करता है।

function waitForMinedTransaction(txHash, tries = 1) {
return new Promise(function(resolve, reject) {
web3.eth.getTransactionReceipt(txHash, function(err, res) {
if (err) reject(err)
if (res) resolve(res)

// nothing yet (retry in 10 sec..)
console.log(`Attempt #${ tries }...`)
if (tries > 60) reject("max_tries_exceeded")
setTimeout(function() { return waitForMinedTransaction(txHash, tries + 1) }, 10000)
})
})
}

मुद्दा यह है कि जब लेन-देन का खनन किया जाता है (जैसे 10 कोशिशों के बाद), तो यह कभी हल नहीं होता है। मुझे यकीन है कि इसके साथ कुछ करना होगा setTimeout और वादा श्रृंखला (जहां एक वादा है) returnके बजाय एड resolve/rejectवर्तमान वादे को आईएनजी) लेकिन इसे ठीक करने पर कुछ संकेत की आवश्यकता है।

उत्तर:

उत्तर № 1 के लिए 4

मैं चैनिंग तर्क को एम्बेड करने का सुझाव दूंगा के भीतर वादा निर्माता कॉलबैक।

यह भी सुनिश्चित करें कि जब आप हल करते हैं या अस्वीकार करते हैं, तो आप बाकी कोड को निष्पादित करने से बचने के लिए फ़ंक्शन से बाहर निकलते हैं। तो एक डाल दिया return कॉल करने से पहले resolve तथा rejectऐसा नहीं है कि रिटर्न वैल्यू का कोई मतलब नहीं है, लेकिन यह सुनिश्चित करने के लिए कि फ़ंक्शन के बाकी कोड निष्पादित नहीं किए गए हैं:

function waitForMinedTransaction(txHash) {
return new Promise(function(resolve, reject) {
(function attempt(triesLeft) {
web3.eth.getTransactionReceipt(txHash, function(err, res) {
if (err) return reject(err);
if (res) return resolve(res);
if (!triesLeft) return reject("max_tries_exceeded");
console.log(`No result. Attempts left: #${ triesLeft }...`);
setTimeout(attempt.bind(null, triesLeft-1), 10000);
});
})(60); // number of retries if first time fails
});
}

यदि आप श्रृंखला में नए वादे करना पसंद करते हैं (जैसा कि आपने करने का प्रयास किया है), तो चाल को जंजीर के वादे के साथ हल करना है, अर्थात् जंजीर कॉल के वापसी मूल्य के साथ:

function waitForMinedTransaction(txHash, triesLeft = 60) {
return new Promise(function(resolve, reject) {
getTransactionReceipt(txHash, function(err, res) {
if (err) return reject(err);
if (res) return resolve(res);
console.log(`No result. Attempts left: #${ triesLeft }...`);
if (!triesLeft) return reject("max_tries_exceeded");
setTimeout(_ => {
resolve(waitForMinedTransaction(txHash, triesLeft-1));
}, 10000);
});
});
}