gpt4 book ai didi

javascript - 有 promise 的 Node 骑士

转载 作者:行者123 更新时间:2023-11-30 16:00:50 31 4
gpt4 key购买 nike

我正在尝试在 horseman 的 evalute 函数中使用 promises。一个简单的例子:

var Horseman = require('node-horseman');
var horseman = new Horseman();

horseman
.open('http://google.com')
.evaluate(function() {
var promise = new Promise(function(resolve,reject){
setTimeout(function(){resolve("Hello")},2000);
});
return promise;
})
.then(function(mesg){
console.log(mesg);
})
.close();

我希望在实现 promise 时将已解析的值“Hello”传递给下一个 then 函数作为 mesg 参数,但我却出现以下错误:

Unhandled rejection fn
evaluate

global code
evaluateJavaScript@[native code]
evaluate@phantomjs://platform/webpage.js:390:39

我错过了什么吗?

最佳答案

PhantomJS 进出浏览器的通信 channel 非常有限。它必须基本上通过基于文本的路径发送所有内容,因此它必须序列化它发送的内容,并反序列化输出的内容。

您可以“输入”一个要在浏览器的 JS 上下文中执行的函数,因为它只是将其转换为字符串。但是出来的东西不能是一个 promise ,因为你失去了包裹在它周围的整个对象。您只能返回标量值和原始对象。如果您查看模块的 home page 中提供的示例,返回一个原始对象:

.evaluate( function(selector){
// Trimmed for clarity...
return {
height : $( selector ).height(),
width : $( selector ).width()
}
}, '.thumbimage')

Node-horseman 确实有一个异步操作模式,但您必须调用一个done() 函数,而不是返回一个 promise,您要求将其作为参数提供给您的函数:

.evaluate(function(ms, done){
var start = Date.now();
setTimeout(function() {
done(null, Date.now() - start);
}, ms);
}, 100)

evaluate() 的返回值已经是一个 promise 。您不需要返回自己的一个。您只需要做任何您想要的异步工作,然后用您的结果值调用 done()

关于javascript - 有 promise 的 Node 骑士,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37790117/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com