2017-10-02 2 views
1

다음과 같은 문제가 있습니다 : 나는 asnychronous 부품을 포함한 인형극에서 페이지 평가를 받았습니다. 비동기 부분에서 인형극으로 값을 반환하고 싶지만 약속이 해결 될 때까지 기다리지 않고 정의되지 않은 값을 반환합니다. 아무도 문제를 해결하는 방법이 있습니까?페이지 평가에서의 반환 값 (puppeteer, asnyc 프로그래밍)

내 샘플 코드 :

const puppeteer = require('puppeteer'); 
async function testing(num) { 
    const browser = await puppeteer.launch({ 
    headless: false, 
    ignoreHTTPSErrors: true 
    }); 
    const page = await browser.newPage(); 
    const evaluating = await page.evaluate((num) => { 
    //some synchrnous stuff (declaring some variablesand so on...) 
    function lookForNumber(num) { 
     if (num > 2) { 
     var asyncstuff = setTimeout(function() { 
      if (num > 10) { 
      console.log('number is greater than 9'); 
      var whatIwantToRetrun = 'ten'; 
      return Promise.resolve(whatIwantToRetrun); 
      //return here 
      } 
      if (num > 5 && num < 10) { 
      console.log('number is samller than 10'); 
      var whatIwantToRetrun = 'nine'; 
      return Promise.resolve(whatIwantToRetrun); 
      //return here 
      } 
      else { 
      num++; 
      lookForNumber(num) 
      } 
     }, 2000); 
     } 
    } 
    lookForNumber(num) 
    }, num) 
    console.log(evaluating); // returns undefined before function has finished 
} 
testing(4) 

인형극 예 : 평가 인 경우 this link 업데이트 된 API에 따르면

const result = await page.evaluate(() => { 
    return Promise.resolve(8 * 7); 
}); 
console.log(result); // prints "56" 

Chromes API on evaluate

, 인형 항상 코드를 평가하고, 약속, 약속을 기다리고 해결하고 약속 값을 반환합니다.

미리 도움을 청하십시오!

편집 : 알아 냈습니다!

+0

. 그리고 자신의 질문에 대답 한 다음 대답으로 표시하면됩니다. –

+0

완료! (10 자) – Noah

답변

1

내 문제에 대한 해결책 : 난 당신이, 당신의 질문을 재 편집하는 것이 좋습니다

const puppeteer = require('puppeteer'); 
let date = require('date-and-time'); 
async function testing(num) { 
    const browser = await puppeteer.launch({ 
    headless: true, 
    ignoreHTTPSErrors: true 
    }); 
    const page = await browser.newPage(); 
    await console.log('starting evaluation'); 
    let now = new Date(); 
    let time = date.format(now, 'YYYY/MM/DD HH:mm:ss'); 
    console.log(time); 
    const test = await page.evaluate(async (num) => { 
    console.log('starting evaluation'); 
    //some synchrnous stuff (declaring some variablesand so on...) 
    function lookForNumber(num) { 
     return new Promise((resolve, reject) => { 
     if (num > 2) { 
      var asyncstuff = setTimeout(function() { 
      if (num > 10) { 
       console.log('number is greater than 9'); 
       var whatIwantToReturn = 'ten'; 
       resolve(whatIwantToReturn); 
      } 
      if (num > 5 && num < 10) { 
       console.log('number is samller than 10'); 
       var whatIwantToReturn = 'nine'; 
       resolve(whatIwantToReturn); 
      } 
      else { 
       num++; 
       lookForNumber(num) 
      } 
      }, 5000); 
     } 
     }); 
    } 
    var returnvalue = await lookForNumber(num); 
    return returnvalue; 
    }, num) 
    console.log(test); 
    now = new Date(); 
    time = date.format(now, 'YYYY/MM/DD HH:mm:ss'); 
    console.log(time); 
    await browser.close(); 
} 
testing(6)