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