правильный способ конвертировать обещание с разрешением и отклонением в асинхронную функцию (кукловод) - PullRequest
0 голосов
/ 05 октября 2018

так что я новичок в асинхронных функциях и обещаниях, представьте, что это многозначно (прошу игнорировать синтаксические ошибки)

await new Promise(async (resolve, reject ) => {
    const page = await browser.newPage();

    await page.goto('https://example.com').catch( ()=>reject('ERROR -> LINK 1 TIMEOUT '));
    // INSERT USERNAME AND PASSWORD 
    await page.$eval('form', form => form.submit()).catch( ()=>reject('ERROR -> FORM SUBMIT ERROR '));

        if( await page.$("#username"))
        {

            reject(" ERROR -> LOGIN FAILED !!!!!!!!!!!!!! ");
        }




    await page.waitForSelector('#xxx').catch( ()=>reject('ERROR -> WAITING FOR ELEMENT TIMEOUT '));

    var scraped_data = // dop some page evaluate and scrap data;

    resolve(scraped_data);

}).then(function(scraped_data){

    await page.close();
    console.log('all done');
    insert_data_in_databas(scraped_data);

})
.catch(function(error){

    console.log(' tab failed : ');
    console.log(error);
});

я хочу преобразовать это в асинхронную функцию ... какой правильный способ сделать это?Должен ли я просто поместить все из них в блок try / catch, например

async function do_stuff(){

    try {
        const page    = await browser.newPage();
        await page.setViewport({ width: 1000, height: 1100});
        await page.goto( 'https://example.com'  );
        // INSERT USERNAME AND PASSWORD 
        await page.$eval('form', form => form.submit());
        await page.waitForSelector('#xxx');
        var scraped_data = // dop some page evaluate and scrap data;
        await page.close();
        console.log('all done');
        insert_data_in_databas(scraped_data);    
    }
    catch (e) {
        await page.close();
        console.log('error');
        console.log(e);
    }
}

, как я могу отклонить, если есть ошибка, чтобы остальной код не выполнялся?Могу ли я иметь пользовательский текст ошибки в блоке catche, например

ERROR -> FORM SUBMIT ERROR 

как мне сделать это

  if( await page.$("#username"))
        {

            reject(" ERROR -> LOGIN FAILED !!!!!!!!!!!!!! ");
        }

, который не является действительной ошибкой (я имею в виду, что это не ошибка кода) в try /катче?

------------------------------------------ изменить --------------------

я попробовал

async function open_tab(){

    try {
        const page    = await browser.newPage();
        await page.setViewport({ width: 1000, height: 1100});
        await page.goto( 'https://google.com'  );
        await page.waitForSelector('#xxx').catch(()=> { throw new Error('ERROR -> LOGIN FAILED')});
        await page.close();
        console.log('all done');
    }
    catch (e) {
        console.log('error');
        console.log(e);
        await page.close();

    }
}

он почти работает, но я не могу закрыть вкладку в блоке перехвата яполучить

UnhandledPromiseRejectionWarning: ReferenceError: page is not defined

и вкладка остается открытой, что не идеально

1 Ответ

0 голосов
/ 05 октября 2018

Не должно быть new Promise, потому что обещание уже существует и может быть приковано цепью.

Если полученное обещание должно быть отклонено в функции async, это:

if (await page.$("#username")) {
   throw new Error('ERROR -> LOGIN FAILED');
}

Это должно быть

let page;
try {
    page    = await browser.newPage();

вместо

try {
    const page    = await browser.newPage();
...