用res.send()来承诺;
我使用phantomjs和phridge来为单个页面应用程序正确共享页面。 这是一些代码示例:
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()
执行?
你犯了很多错误。 在编写这些代码之前,你应该确保你熟悉Promise
风格的编程。 见最后一节。
在这种情况下,不,因为
.then(function (contnt) { res.send(contnt); })
部分是没有回报的Promise
。
在这一部分,如果你确定res.send
不会引发任何exception,你可以写:
.then(function (contnt) { res.send(contnt); return new Promise() })
而后期,
.then(phridge.disposeAll())
也有问题,你应该修改它
.then(() => phridge.disposeAll())
即使是链的末尾,也没有创build新的Promise
用法,你应该这样写,因为then()
函数将函数作为参数,而不是结果。
而且你需要确保每个.then()
分支链接它们时都会返回一个类似Promise
对象。 (我没有检查其他人,因为我不知道他们回来了。)
好吧,还有更多的错误,我看到多余的;
之后then()
分支。 我不确定是否还有更多的问题。
我觉得这个问题更严重:你没有理解Promise
风格的编程。 您应该首先仔细阅读ES6 Promise 文档或Promise库(如bluebird
,取决于您的库依赖于哪个库)。
我将结合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); })