2017-05-10 3 views
1

Je reçois un "rejet de promesse non géré" lorsque je tente de charger une page (à partir de codefights.com) et d'attendre que certains éléments html soient chargés.Refus de promesse non géré avec Nightmare.js

Voici mon code:

import * as Nightmare from 'nightmare'; 

const nightmare = Nightmare({ show: true }); 

nightmare 
    .goto('https://codefights.com/interview/EDaACHNYHyH6qQFAL') 
    .wait('body > div:nth-child(9) > div > div.page--header > div > span') 
    .evaluate((selector) => { 
     return document.querySelector(selector); 
    }, 'body > div:nth-child(9) > div > div.page--header > div > span') 
    .end() 
    .then((functionTitle) => { 
     console.log(functionTitle); 
    }); 

est ici l'exception:

Unhandled promise rejection (rejection id: 1): Error: Evaluation timed out after 30000msec. Are you calling done() or resolving your promises?

Toutes les idées sur la façon de résoudre ce problème?

+0

Êtes-vous en essayant d'empêcher le délai d'attente de rejet ou survenant d'être non gérée? – Bergi

+0

@Bergi J'essaie d'empêcher le rejet d'être non gérée. Je pense que je l'ai compris aussi, la fonction d'évaluation doit renvoyer une promesse si elle est suivie d'un 'alors'. – Kiril

+0

Ensuite, enchaînez simplement '.catch (handler)' à votre chaîne ou passez le gestionnaire comme deuxième argument à la 'chain' finale. – Bergi

Répondre

0

Pour gérer le rejet, juste chaîne une .catch(handler) à votre chaîne ou passer le gestionnaire comme second argument au chain final:

nightmare 
.goto('https://codefights.com/interview/EDaACHNYHyH6qQFAL') 
.wait('body > div:nth-child(9) > div > div.page--header > div > span') 
.evaluate(selector => { 
    return document.querySelector(selector); 
}, 'body > div:nth-child(9) > div > div.page--header > div > span') 
.end() 
.then(functionTitle => { 
    console.log(functionTitle); 
}, error => { 
    console.error(error); 
}); 
0

Après avoir creusé dans the documentation a bit more, j'ai découvert que evaluate devrait retourner un Promise s'il est suivi de then.

Promise s sont également pris en charge dans le cadre de evaluate. Si la valeur de retour de la fonction a un membre alors, .evaluate() suppose qu'il est en attente d'une promesse.

Voici à quoi il ressemble quand il est fixé:

nightmare 
.goto(url) 
.wait('body > div:nth-child(9) > div > div.page--header > div > span') 
.evaluate((selector) => { 
    return new Promise((resolve, reject) => { 
     try { 
      resolve(document.querySelector(selector).innerText); 
     } catch (exception) { 
      reject(exception); 
     } 
    }); 
}, 'body > div:nth-child(9) > div > div.page--header > div > span') 
.end() 
.then((functionTitle) => { 
    console.log(functionTitle); 
});