我正在使用带有phridge的phantomjs来为单页应用程序正确共享页面。 这是一些代码示例:
if (isbot(req.headers['user-agent'])){
var url= req.protocol+'://'+req.get('host')+ req.originalUrl
phridge.spawn()
.then(function (phantom) {
var page = phantom.createPage();
return page.run(url, function (url, resolve, reject) {
var page = this;
page.open(url, function (status) {
// handle page after load
});
})
.then(function (contnt) {
res.send(contnt);
})
.then(phridge.disposeAll());
.catch(function (err) {
console.error(err.stack);
})
}
else {
next();
}
问题是 - 机械师res.send()
如何与承诺合作?将phridge.disposeAll()
执行?
答案 0 :(得分:1)
你犯了很多错误。在编写这些代码之前,您应该确保熟悉Promise
样式编程。见最后一节。
在这种情况下,不,因为
.then(function (contnt) {
res.send(contnt);
})
部分未返回Promise
。
在这部分中,如果你确定res.send
不会引发任何异常,你可以写:
.then(function (contnt) {
res.send(contnt);
return new Promise()
})
后面的部分,
.then(phridge.disposeAll())
也有问题,你应该将其修改为
.then(() => phridge.disposeAll())
即使它是链的末尾并且没有使用创建新的Promise
,你也应该这样写,因为then()
函数需要函数而不是结果参数。
并且您需要确保每个.then()
分支在链接它们时返回Promise
类似对象。 (我没有检查其他人,因为我不知道他们的回报。)
好的,还有更多错误,我在;
分支后看到了多余的then()
。我不确定是否还有更多问题。
我认为问题更严重:你不理解Promise
样式编程。您应该首先阅读ES6 Promise docs或Promise库(如bluebird
,取决于您的库所依赖的库)文档。
答案 1 :(得分:0)
我会将res.send
和disposeAll()
结合起来。无需过度复杂化代码。
res.send
是同步的并返回一个布尔值。
phridge.spawn()
.then(function (phantom) {
var page = phantom.createPage();
return page.run(url, function (url, resolve, reject) {
var page = this;
page.open(url, function (status) {
// handle page after load
});
})
.then(function (contnt) {
res.send(contnt);
phridge.disposeAll()
})
.catch(function (err) {
console.error(err.stack);
})