Javascript 如何预防';未经处理的PromiserRejection';用户输入错误?

Javascript 如何预防';未经处理的PromiserRejection';用户输入错误?,javascript,node.js,promise,async.js,Javascript,Node.js,Promise,Async.js,我有两个文件,main.js和input.js。 在input.js中,我提示用户以“1-10”(字符串)格式给我一个间隔。稍后,我剪切此字符串并从中获取2个数字,并检查数字是否正确: let getInput = () => { return new Promise(function (resolve, reject) { readline.question(`Give me interval (e.g.: 1-10).\n`, (input) => { l

我有两个文件,main.js和input.js。 在input.js中,我提示用户以“1-10”(字符串)格式给我一个间隔。稍后,我剪切此字符串并从中获取2个数字,并检查数字是否正确:

let getInput = () => {
  return new Promise(function (resolve, reject) {
    readline.question(`Give me interval (e.g.: 1-10).\n`, (input) => {
      let fields = input.split('-');
      let startNumber = Number(fields[0]);
      let endNumber = Number(fields[1]);
      if ((startNumber) && (endNumber) && (startNumber > 0) && (endNumber >= startNumber)) {
        console.log(`ok`);
        readline.close()
        resolve([startNumber, endNumber]);
      } else {
        reject('not ok');
        getInput();
      }
    });
  });
}
在main.js中,我异步调用此函数,并将其结果保存到一个变量中:

let intervalArray = await getInput();
.
.
.
someotherstuff
我的问题是如果我提供了错误的输入(例如“0-1”或“10-9”或“-10”) 我有一个未处理的Promise错误,因此代码不会执行更多。 我的目标是当用户输入错误时,控制台中会出现“不正常,给我另一个”,程序应该等待另一个输入。如果输入正确,则继续执行。如果没有,程序应该请求另一个输入

我怎样才能做到这一点

编辑: 这是完整的代码。 Input.js:

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

let getInput = () => {
  return new Promise(function (resolve, reject) {
    readline.question(`tol-ig formatumban (pl.: 1-10).\n`, (data) => {
      let fields = data.split('-');
      let startNumber = Number(fields[0]);
      let endNumber = Number(fields[1]);
      if ((startNumber) && (endNumber) && (startNumber > 0) && (endNumber >= startNumber)) {
        console.log(`Kereses inditasa ${startNumber}-${endNumber} oldalakon.`);
        readline.close()
        resolve([startNumber, endNumber]);
      } else {
        readline.close();
        reject(new Error('not ok'));
      }
    });
  });
}

module.exports.getInput = getInput;
和main.js:

const puppeteer = require('puppeteer');
const { getInput } = require('./input');
const { mouseMovements } = require('./mouse');
const { tuneUserAgent } = require('./userAgent');

async function listItems() {
  let intervalArray = null;
  while (intervalArray === null) {
    try {
      let intervalArray = await getInput();
    } catch (err) {
      // write to user not ok
    }
  }
  const browser = await puppeteer.launch({ headless: false });
  const context = await browser.createIncognitoBrowserContext();
  const page = await context.newPage();

  const extractPartners = async url => {
    const page = await context.newPage();
    await tuneUserAgent(page);

    await page.goto(url, { waitUntil: 'load' });
    await page.waitFor(Math.round(Math.random() * 500) + 500);

    await mouseMovements(page);

    const partnersOnPage = await page.evaluate(() =>
      Array.from(document.querySelectorAll("div.compact"))
        .map(compact => (compact.querySelector(".logo a").href.slice(-16))));
    await page.close();

    const nextPageNumber = parseInt(url.match(/page=(\d+)$/)[1], 10) + 1;
    if (nextPageNumber > endPage) {
      console.log(`Terminate recursion on: ${url}`);
      return partnersOnPage;
    } else {
      console.log(`Scraped: ${url}`);
      const nextUrl = `https://marketingplatform.google.com/about/partners/find-a-partner?page=${nextPageNumber}`;
      let randomWait = (Math.round(Math.random() * 2000) + 1000);
      await page.waitFor(randomWait);
      return partnersOnPage.concat(await extractPartners(nextUrl));
    }
  };
  let startPage = intervalArray[0];
  let endPage = intervalArray[1];
  const firstUrl =
    `https://marketingplatform.google.com/about/partners/find-a-partner?page=${startPage}`;
  const partners = await extractPartners(firstUrl);
  await browser.close();
  return Promise.resolve(partners);
};

module.exports.listItems = listItems;

你必须处理这个错误。在使用wait时,最简单的方法是使用try-catch

try {
  let intervalArray = await getInput();
} catch (err) {
  // write to user not ok
}
您可以将其包装在循环中,以不断请求用户输入新的输入

let intervalArray = null;
while (intervalArray === null) {
    try {
      let intervalArray = await getInput();
    } catch (err) {
      // write to user not ok
    }
}
^^记住删除
getInput()来自新承诺的
部分。也许您还需要关闭readline,因为您将再次打开它。另外,拒绝类似于抛出错误,您应该始终将基于错误的对象发送到那里

  } else {
    readline.close();
    reject(new Error('not ok'));
  }

编辑:更新后我创建了POC。
readline.close()
实际上不应该在那里(看起来只是一次性使用),但是这个POC看起来很好:

toberrequired.js

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

let getInput = () => {
    return new Promise(function (resolve, reject) {
        readline.question(`tol-ig formatumban (pl.: 1-10).\n`, (data) => {
            let fields = data.split('-');
            let startNumber = Number(fields[0]);
            let endNumber = Number(fields[1]);
            if ((startNumber) && (endNumber) && (startNumber > 0) && (endNumber >= startNumber)) {
                console.log(`Kereses inditasa ${startNumber}-${endNumber} oldalakon.`);
                readline.close()
                resolve([startNumber, endNumber]);
            } else {
                reject(new Error('not ok'));
            }
        });
    });
}

module.exports.getInput = getInput;
const a = require('./toBeRequired');

async function x() {
  let input = null;
  while (input === null) {
    try {
      input = await a.getInput();
    } catch (err) {
      console.log('nooo');
    }
  }
}

x();
server.js

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

let getInput = () => {
    return new Promise(function (resolve, reject) {
        readline.question(`tol-ig formatumban (pl.: 1-10).\n`, (data) => {
            let fields = data.split('-');
            let startNumber = Number(fields[0]);
            let endNumber = Number(fields[1]);
            if ((startNumber) && (endNumber) && (startNumber > 0) && (endNumber >= startNumber)) {
                console.log(`Kereses inditasa ${startNumber}-${endNumber} oldalakon.`);
                readline.close()
                resolve([startNumber, endNumber]);
            } else {
                reject(new Error('not ok'));
            }
        });
    });
}

module.exports.getInput = getInput;
const a = require('./toBeRequired');

async function x() {
  let input = null;
  while (input === null) {
    try {
      input = await a.getInput();
    } catch (err) {
      console.log('nooo');
    }
  }
}

x();

在同一个文件夹中创建这两个文件并运行
node server.js

我已经用您的解决方案更新了我的代码,但它是相同的;在输入错误的情况下,我得到了承诺错误,执行停止。@ConTroll-然后用您现在的完整解决方案更新您的问题,可能还有一些您不知道的错误。@ConTroll-现在可能是不同的错误。你可以从我的POC开始,然后继续添加内容。此外,您还应该看到error stacktrace,它应该告诉您错误的位置以及原因。
const readline = require('readline').createInterface({
    input: process.stdin,
    output: process.stdout
});

let getInput = () => {
    return new Promise(function (resolve, reject) {
        readline.question(`tol-ig formatumban (pl.: 1-10).\n`, (data) => {
            let fields = data.split('-');
            let startNumber = Number(fields[0]);
            let endNumber = Number(fields[1]);
            if ((startNumber) && (endNumber) && (startNumber > 0) && (endNumber >= startNumber)) {
                console.log(`Kereses inditasa ${startNumber}-${endNumber} oldalakon.`);
                readline.close()
                resolve([startNumber, endNumber]);
            } else {
                reject(new Error('not ok'));
            }
        });
    });
}

module.exports.getInput = getInput;
const a = require('./toBeRequired');

async function x() {
  let input = null;
  while (input === null) {
    try {
      input = await a.getInput();
    } catch (err) {
      console.log('nooo');
    }
  }
}

x();