无法使用 javascript 中的 Promise 遍历问题数组中的每个项目
Posted
技术标签:
【中文标题】无法使用 javascript 中的 Promise 遍历问题数组中的每个项目【英文标题】:Unable to iterate over every item in the array of questions using promises in javascript 【发布时间】:2020-12-30 21:46:25 【问题描述】:我需要将问题存储在一个数组中,并使用扩展运算符创建一个 Promise 数组,并使用 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
是做什么的?在给出任何答案之前可以多次调用它吗?
@trincot rl.question(query, callback)
好的,但是我看不出Promise.all
有什么用处,因为(在正确的实现中)你永远不会有多个待处理的承诺。
在这种情况下,我想创建一个等待答案的承诺数组。
【参考方案1】:
问题在于,在下面的代码中,您立即为 所有 问题调用 rl.question
,而您应该等待启动第二个问题,直到您得到第一个问题的答案,...等等
const promiseQuestions=questions.map((question)=>
return new Promise((resolve,reject)=>
rl.question(question,(input)=>resolve(input));
);
);
使您的函数async
并在for
循环中使用await
在收到前一个问题的答案后执行一个问题。这导致 one 承诺,因此 Promise.all
在这里没有用处。如果您可以并行执行问题(您尝试过),Promise.all
会很有用,但rl.question
不能这样工作。
这是建议的解决方案。为了让它在浏览器 sn-p 中运行,我模拟了 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>
【讨论】:
不确定你在做什么。我从来没有写过Promise.all
是主要问题。以上是关于无法使用 javascript 中的 Promise 遍历问题数组中的每个项目的主要内容,如果未能解决你的问题,请参考以下文章
text ZwracaniewartościzObietnic /Promisów
无法使用 javascript 中的 Promise 遍历问题数组中的每个项目