2017-02-17 5 views
1

私は1ページのアプリケーションの正しい共有ページにphantomjsをphridgeで使用しています。Promise with 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());' '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()) 

とすると、チェーンの終わりであっても作成するw Promiseの場合、then()関数は結果ではなく関数を引数に取るため、このように記述する必要があります。

そして、それぞれの.then()ブランチが、チェーンされている間にオブジェクトのようにPromiseを返すようにする必要があります。 (私は彼らが返すかわからないので、私は他の人をチェックしませんでした。)


OKを、より多くのエラーがありますが、私はthen()分岐後に冗長;を見てきました。もっと問題があるかどうかはわかりません。

私は問題がより深刻だと思います。Promiseスタイルプログラミングを理解していません。あなたはES6 Promise docsまたはPromiseライブラリ(bluebirdのような、あなたのライブラリが依存するライブラリに依存します)をよく読んでください。

+0

Maby先読みドキュメントhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then#Return_value –

+0

@ ponury-kostekええ、私は、質問の著者がトピックに精通していない可能性があることに気づいた、ありがとう。 – Chazeon

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