2017-02-17 7 views
1

Я использую phantomjs с формулой для правильного обмена страницами для одностраничного приложения. Вот некоторый пример кода:Обещание с res.send();

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() выполнено?

+1

Эта строка выглядит неправильно - '.then (phridge.disposeAll());' does 'phridge.disposeAll()' возвращает функцию? потому что аргументы '.then' должны быть функцией ... возможно, вы хотели сделать' .then (phridge.disposeAll), ' –

+0

' phridge.disposeAll() 'будет выполнен. 'res.send()' работает точно так же, как в синхронной функции –

ответ

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()) 

, даже если это конец цепи, и нет необходимости создавать ne w Promise, вы должны написать его так, потому что функция then() принимает функции, а не результат, чтобы быть ее аргументом.

И вам нужно убедиться, что каждая ветка .then() возвращает объект Promise, пока вы их цепляете. (Я не проверял другие, так как я не знаю, что они возвращают.)


ОК, есть несколько ошибок, я видел избыточный ; после then() ветви. Я не уверен, есть ли еще проблемы.

Я думаю, что проблема более серьезная: вы не понимаете Promise программирование стиля. Вы должны прочитать ES6 Promise docs или библиотеку Promise (например, bluebird, зависит от того, от какой библиотеки зависит ваша библиотека).

+0

Maby first read docs https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then#Return_value –

+0

@ ponury-kostek Да, я понял, что автор вопроса может быть незнаком с темой, спасибо. – Chazeon

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); 
     })