регистрация ошибок в асинхронных функциях - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть этот код:

async function getURL() {
   try {
       await fetch("http://www.blah.com");
       return 0;
   } catch (err) {
       return err;
   }
}

getURL().then( result => {
    if (result === 0) console.log("success");
    else console.log(result);
});

Выборка не удастся, и ошибка будет зарегистрирована на консоли. Как мне переделать код, чтобы он везде использовал async и try / catch? То есть я стараюсь избегать выполнения getURL (). Затем во имя последовательности.

EDIT:

Для тех, кто голосует против меня, await getURL() не будет работать, так как это неверный синтаксис.

EDIT2:

Попробовал это, но не уловил ошибку:

async function getURL() {
    return await fetch("http://www.blah.com");
}

let result = async function() {return await getURL();}

try {
    result();
} catch (e) {
    console.log(e);
}

Ответы [ 3 ]

0 голосов
/ 01 сентября 2018

Вы можете заключить весь код в мгновенно выполняемую асинхронную функцию, например:

// service.js
async function getURL() {
  return await fetch("http://www.blah.com");
}

// your.module.js
(async function() {
  // do things...

  try {
    let result = await getURL();
  } catch (e) {
    console.log(e);
  }

  // do things...

  res.send({});
});
0 голосов
/ 02 сентября 2018

Теперь я понимаю, что асинхронные функции всегда возвращают обещание. Даже если вы выбросите ошибку, она все равно будет заключена в обещание. Поэтому использование try / catch не поможет. Вот так я и написал код:

async function getURL() {
    return await fetch("http://fake");
 }

 getURL().then( () => console.log("success")).catch( (e) => console.log(e));
0 голосов
/ 01 сентября 2018

Каждый раз, когда вам нужно поймать ошибку из обещания, либо с помощью new Promise, async-await или generator вам нужно использовать .then(), либо вы можете сделать что-то подобное еще async-await.

async function getURL() {
    try {
        await fetch("http://www.blah.com");
        return 0; // EDIT: just returning value which is success
    } catch (err) {
        return err; // EDIT: returning value not rejecting a promise
    }
}

async function main () {
    try {
        let result = await getURL();
        if (result === 0) console.log("success");
        console.log(result); // EDIT: error will be print.
    }
    catch (err) { // EDIT: getURL() never rejects so always success.
        console.log(err);
    }
});

main();

Эта ситуация на самом деле не возникает, поскольку наша основная функция в server-side или client-side является асинхронной и обрабатывает ее для нас.

Как использовать express:

app.post('/api', async (req, res) => {
    try {
        let result = await getURL();
        res.send(async);
    }
    catch(err) {
        res.send(err);
    }
});

РЕДАКТИРОВАТЬ: asyn-await не reject или resolve вызов, просто вернуть значение. Таким образом, должны быть использованы осторожно.

function fetch(url) {
    return new Promise( (resolve, reject) => {
        let x = Math.floor(Math.random() * Math.floor(9) + 1);
        // 50-50 resolve or reject
        if(x%2===0) return resolve(false); //resolve with `false` statement
        reject(true); // reject with `true` still a reject
    });
}

async function getURL() {
    try {
        await fetch("http://www.blah.com"); 
        return 0; // if fetch resolve
    } catch (err) { //only if fetch reject
        return err;
    }
}

async function main () {
    try {
        let result = getURL();
        if (result === 0) console.log("success"); //getURL never reject any call
        console.log(result);
    }
    catch (err) { // getURL doesnt reject
        console.log(err);
    }
};

main();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...