承诺res.send();

时间:2017-02-17 13:15:05

标签: node.js express promise

我正在使用带有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()执行?

2 个答案:

答案 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.senddisposeAll()结合起来。无需过度复杂化代码。 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);
        })