繁体   English   中英

无法使用 javascript 中的承诺迭代问题数组中的每个项目

[英]Unable to iterate over every item in the array of questions using promises in javascript

我需要将问题存储在一个数组中,并使用扩展运算符创建一个承诺数组,并使用 Promise.all 等待它们并在不同的数组中收集答案。 但是我的代码只取第一个值,而不是下一个问题。

const rl = readline.createInterface(process.stdin, process.stdout);

function PromiseAllReadline(){
   const questions=['What is you NAme?','What is your Age?','What is your Occupation?'];
   const answers=[];
   const promiseQuestions=questions.map((question)=>{
       return new Promise((resolve,reject)=>{
           rl.question(question,(input)=>resolve(input));
       });
   });

   Promise.all(promiseQuestions)
     .then((values)=>{
         console.log('values',values);
     })
     .catch((error)=>{
         console.log('error is',error);
     });
}

PromiseAllReadline();

问题是,在下面的代码中,您立即为所有问题调用rl.question ,而您应该等待启动第二个问题,直到得到第一个问题的答案,等等。

const promiseQuestions=questions.map((question)=>{
    return new Promise((resolve,reject)=>{
        rl.question(question,(input)=>resolve(input));
    });
});

使您的函数async并在for循环中使用await在收到上一个问题的答案后执行一个问题。 这会导致一个promise,因此Promise.all在这里没有用。 如果您可以并行执行问题(您尝试过),那么Promise.all会很有用,但是rl.question不会那样工作。

这是建议的解决方案。 为了让它在浏览器片段中运行,我嘲笑了rl (忽略该代码):

 // Mock for rl: const rl = { question(question, callback) { document.querySelector("div").textContent = question; let input = document.querySelector("input");let button = document.querySelector("button");input.value = "";button.addEventListener("click", function handler() {button.removeEventListener("click", handler);callback(input.value);});}}; async function promiseAllReadline() { const questions = ['What is you Name?','What is your Age?','What is your Occupation?']; const answers = []; for (let q of questions) { answers.push(await new Promise(resolve => rl.question(q, resolve))); } return answers; } promiseAllReadline().then((values) => { console.log('values', values); }).catch((error) => { console.log('error is', error); });
 <div></div><input><button>Submit</button>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM