2017-10-02 4 views
1

私は次の問題があります: 私は奇妙な部分を含む人形のページ評価をしています。私は非同期部分から人形に値を戻したいが、それはプロミスが解決するのを待つことなく、未定義に戻るだけである。問題を解決する方法は誰ですか?ページ評価からの返り値(puppeteer、asnyc programming)

私のサンプルコード:

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) 
関連する問題