当前位置: 首页 > 知识库问答 >
问题:

如何使用Async/Await从用户获得输入,但要等到读取整个条件语句后才能解析?

阎麒
2023-03-14

我创建了一个函数,该函数提示用户输入URL,然后验证输入的输入实际上是一个URL。问题是,当我从另一个函数调用这个函数时,我已经能够让它等待用户输入,但它在返回URL之前没有经过整个条件语句。

const readline = require('readline').createInterface({
   input: process.stdin,
   output: process.stdout,
});

// request url from user in command prompt
const requestSiteURL = () => {
  return new Promise((resolve, reject) => {
    readline.question('Please type url: ', async (url) => {
      if (validUrl.isUri(url)) {
        readline.close();
        resolve(url);
        // if user types no, then use base url
      } else if ('No' || 'no' || 'NO') {
        url = URL;
        resolve(url);
      } else {
        reject(
          console.log(
            'Please type in a valid URL or type "no" to use base url.'
          )
        );
        requestSiteURL();
      }
    });
  });
};

// grabs all urls from original link and returns array
const getURLS = async () => {
  let url = await requestSiteURL();
  url = deleteFowardSlash(url);
  try {
    const res = await axios.get(url);
    const data = res.data;
    const $ = cheerio.load(data);

    const urlQueue = [];

    // finds all absolute links and pushs to urlQueue array
    $("a[href^='http']").each((i, elem) => {
      let link = $(elem).attr('href');
      //checks to make sure link isnt any duplicate links in urlqueue array
      link = deleteFowardSlash(link);
      uniqueLinkChecker(link, urlQueue);
    });
    return urlQueue;
  } catch (err) {
    console.error(err);
    return response.status(400).send(err);
  }
};

共有1个答案

司空玮
2023-03-14

我认为这是句法的问题。在这里,我将原来的行切换到正确使用Promise构造函数。许诺mdn

// request url from user in command prompt
const requestSiteURL = () => {
  return new Promise((resolve, reject) => {
    readline.question('Please type url: ', async (url) => {
      if (validUrl.isUri(url)) {
        readline.close();
        resolve(url);
        // if user types no, then use base url
      } else if (url.toLowerCase() === 'no') {
        url = URL;
        resolve(url);
      } else {
        console.log(
          'Please type in a valid URL or type "no" to use base url.'
        )
        requestSiteURL().then(resolve);
      }
    });
  });
};

编辑:添加异步/等待版本。基本上,我认为你不必拒绝。我编辑了上面的不拒绝以及。另外,我假设url是默认url(这与全局url命名空间冲突,仅供记录)

// request url from user in command prompt
const requestSiteURL = async function () {
  const url = await new Promise(resolve => {
    readline.question('Please type url: ', resolve)
  })
  if (validUrl.isUri(url)) {
    readline.close()
    return url
  } else if (url.toLowerCase() === 'no') {
    return URL
  } else {
    console.log('Please type in a valid URL or type "no" to use base url.')
    return requestSiteURL()
  }
}
 类似资料:
  • 问题内容: 我无法弄清楚/的运作方式。我对此有些了解,但无法使其正常工作。 我知道我可以使用,但是如果这样做,我知道我永远不会理解/ 我只会埋葬这个问题。 目标:调用并返回文件的内容。 每次调用该文件都会增加一次(每页加载)。该文件包含二进制缓冲区的转储,并存储在SSD中。 无论我做什么,都会出现错误或在控制台中。 问题答案: 要使用/,您需要返回承诺的方法。没有包装器,核心API函数就不会这样做

  • 我找到了Polly包,它被设置为在C#中处理try/catch重试。我目前的代码设置如下: 我的方法只是在主线程的当前页面上显示一个: 当我调试这个并切断我的internet连接时。从不显示。发生两件事之一: null 更新: 在将对的调用放到方法中之后,我现在找到了绕过的方法。然而,现在我又有了一个问题。 一旦我断开与internet的连接,就会像应该的那样弹出。程序在完成函数之前等待我单击重试

  • 问题内容: 我喜欢Typescript等中提供的新功能的平坦性。但是,我不确定我是否必须在块的外部声明要输入的变量以便以后使用,这一点我不确定。像这样: 如果我错了,请纠正我,但是似乎最好的做法是不要在主体中放置多行业务逻辑,因此,我只剩下在块外声明,在块中分配,以及然后使用它。 在这种情况下,最佳做法是什么? 问题答案: 似乎最好的做法是不要在try主体中放置多行业务逻辑 其实我会说是的。通常,

  • 我已经复习了/,在复习了几篇文章之后,我决定自己测试一下。然而,我似乎无法理解为什么这不起作用: 控制台输出以下内容(节点V8.6.0): >外:“对象承诺” >内部:嘿那里 为什么函数内部的日志消息会在之后执行?我认为创建/的原因是为了使用异步任务执行同步执行。 有没有一种方法可以使用函数内部返回的值,而不用后面的?

  • 问题内容: 我尝试创建一个计算器,但由于不知道如何获得用户输入而无法使它工作。 如何获得Java中的用户输入? 问题答案: 你可以根据要求使用以下任何选项。 Scanner class BufferedReader and InputStreamReader classes DataInputStream class 该类中的方法已被弃用。若要获取值,应将先前的解决方案与一起使用 Console

  • 问题内容: 我正在尝试创建一个基本菜单,以检查输入的变量是否与定义的变量匹配。如果定义了变量,则获取已定义变量的数据。 例。 我输入 应该相等 问题答案: 这似乎是您要找的东西: 但是,这可能不是最好的策略,因为错字或恶意用户很容易使您的代码崩溃,系统过载或执行他们喜欢的任何其他讨厌的事情。对于这种特殊情况,更好的方法可能是