2017-10-15 217 views
0

當我在命令行中運行node script.js下面的腳本,其結果是:Phantomjs與節點給「無極待定」

success 
Promise { <pending> } 

頁從未console.log被打開了,任何人都可以解釋,爲什麼?

var phantom = require('phantom'); 

phantom.create().then(function (ph) { 
    ph.createPage().then(function (page) { 
    page.open('https://stackoverflow.com/').then(function (status) { 
     console.log(status); 
     var p = page.evaluate(function() { 
     return document.getElementsByTagName('html')[0].innerHTML 
     }); 
     console.log(p); 
    }); 
    }); 
}); 

回答

1

如顯示,page.evaluate返回一個承諾。

嘗試如下因素代碼:

var phantom = require('phantom'); 
phantom.create().then(function(ph) { 
    ph.createPage().then(function(page) { 
    page.open('https://stackoverflow.com/').then(function(status) { 
     console.log('test'+status); 
     var p = page.evaluate(function() { 
       return document.getElementsByTagName('html')[0].innerHTML 
      }); 
     p.then(function(pagecontent) { 
     console.log(pagecontent); 
     process.exit() 
     }); 
    }); 
    }); 
}); 
1

這是因爲您將Promise分配給變量,並且結果不會立即返回。你還是:

page.evaluate(function() { 
    return document.getElementsByTagName('html')[0].innerHTML; 
}).then(function (html) { 
    console.log(html); 
}); 

此外,爲了不迷失在回調地獄,你可以嘗試使用async/await方法:

(async() => { 
    const instance = await phantom.create(); 

    const page = await instance.createPage(); 

    const status = await page.open('https://stackoverflow.com/'); 

    const html = await page.evaluate(function() { 
    return document.getElementsByTagName('html')[0].innerHTML; 
    }); 

    console.log(html); 
})(); 

,它是根據phantom維護指南樣的首選方式。