簡體   English   中英

一連串的承諾如何在不被消耗/履行的情況下返回?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM