无法使用 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 遍历问题数组中的每个项目的主要内容,如果未能解决你的问题,请参考以下文章

Promis.then()

text ZwracaniewartościzObietnic /Promisów

无法使用 javascript 中的 Promise 遍历问题数组中的每个项目

无法使用 JavaScript 文件中文档目录中的图像

无法使用内联代码删除 Aptana 中的 Javascript JsLint 错误

Promise的那些事儿