[英]How does a chain of promises return without being consumed/fulfilled?
我對以下代碼的工作方式感到困惑。 我希望在Promise.resolve()返回一個已解決的諾言之后-而不是一個未決的諾言-.then()應該立即使用/兌現它,這意味着; 在每個reduce回調調用中,將詢問兩個問題(promise鏈)-但實際上它們都是鏈,並且僅在函數chainPromise返回時才相互消耗並一起運行。
這是因為我們正在等待“調用堆棧”為空,並且每個.then()正在等待上一個.then()回調結束,以便其返回promise等。 減少如何發揮作用?
有人可以幫助我更好地理解代碼及其背后的概念嗎?
var fs = require("fs"); var readline = require("readline"); var rl = readline.createInterface({ input: process.stdin, output: process.stdout }); let questionsData = []; promisifyQuestion('How many languages do you know? \\n') .then((numOfLanguauges) => { return chainPromises(numOfLanguauges) }) .then((data) => { fs.writeFile("./langs.json", JSON.stringify(questionsData), () => {}); return promisifyQuestion('Display lang?'); }) .then(x => { console.log(JSON.stringify(questionsData.find(el => el.name == x))); rl.close(); }); function promisifyQuestion(msg) { return new Promise((resolve, reject) => { rl.question(msg, resolve); }); } function chainPromises(length) { for (var i = 0; i < length; questionsData[i++] = {}); let singleValue = questionsData.reduce(outerReduce, Promise.resolve()); //Promise chain does fire only on chainPromises end return singleValue; } function outerReduce(prevRes, currentElement, currentIndex) { return prevRes .then(() => promisifyQuestion('language name:')) .then(x => { questionsData[currentIndex].name = x; return promisifyQuestion('years of speaking it:'); }) .then(x => { return questionsData[currentIndex].years = x }); }
承諾要等到JavaScript調用堆棧為空。 下面的代碼段顯示1 2 3
,指示.then
回調不會立即運行。 從技術上講,它們是在微任務隊列中調度的,與事件循環分開。
console.log('1'); Promise.resolve().then(()=>console.log('3')); console.log('2');
您的示例更長且更復雜,但可以歸結為這一點。
一些閱讀材料:
Promise.resolve()
返回一個實現承諾-不掛起一個-.then()
對子級立即使用它
對,那是正確的。
在每個reduce回調調用中,將詢問兩個問題(承諾鏈)
否。僅會立即調用鏈中的第一個 then
回調。 其他then
調用不是初始Promise.resolve()
值,而是對先前所返回的。 而那些並沒有立即實現,它們解決並等待then
回調返回的承諾。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.