मेरे पास निम्न कोड है जो इथेरियम ब्लॉकचेन पर खनन करने के लिए लेनदेन की प्रतीक्षा करता है।
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);
});
});
}