2016-08-22 6 views
0

次のコードがあります。コメントなしで2行を見てください。何も出力されていません。 init()機能のresolve()が機能のthen()の実行を引き起こさない理由を理解できません。あなたはほぼ確実block()で例外を受けている、と.catch()を追加する必要がありますNodejs:プロミスオブジェクトが解決しない

module.exports = function(url, list){ 
    var phantom  = require('phantom'); 
    var Blacklist = require('../../lib/util/http/blacklist'); 

    var blacklist = new Blacklist(list); 

    this.load = function(){ 
     console.log('phantom-page:load', url); 
     return new Promise(function(resolve, reject){ 
      init() 
       .then(function(page){ 
        console.page('open:', url); // This doesn't output 
        page.open(url) 
         .then(function(status){ 
          console.log('opened:', url); 
          resolve(page, status); 
         }) 
        ; 
       }) 
      ; 
     }); 
    }; 

    function init(){ 
     console.log('phantom-page:init', url); 
     return new Promise(function(resolve, reject){ 
      phantom.create() 
       .then(function(instance){ 
        console.log('phantom-page: page created'); 
        return instance.createPage(); 
       }) 
       .then(function(page){ 
        block(page); 
        resolve(page); 
        console.log(resolve); // This outputs [Function] 
       }); 
      ; 
     }); 

    } 

    function block(page){ 
     console.log('phantom-page:block:rawRegExp', blacklist.rawRegExp); 
     page.on('onResourceRequested', true, function(requestData, request, raw) { 
      var url = requestData['url']; 
      console.log('phantom-page:block:resource', url); 
      var regRaw = '(/' + raw + '/gi).test("' + url + '")'; 
      var isBlacklisted = eval(regRaw); 
      if (isBlacklisted) { 
       console.log('phantom-page:block:abort', url); 
       request.abort(); 
      } 
     }, blacklist.rawRegExp); 
    } 

}; 
+0

あなたの 'init'約束の終わりに' .catch'を追加するとどうなりますか? – Mike

答えて

1

.then(function(page){ 
     block(page); 
     resolve(page); 
     console.log(resolve); // This outputs [Function] 
    }).catch(function(e) { console.log(e) }); 

あなたの質問は、あなたのconsole.log()が発射された理由よりも、これは動作していない理由について以下のようですし、 [Function]を出力しても、あなたが呼び出したのがresolve()であっても、呼び出し元は解決しません。

ここには約束があるからです。 console.log()は、現在の "tick"ですぐに実行されます。しかし、resolve()はそうではありません - それは(あなたが使っているPromiseライブラリにほとんど依存します)常に次のチックに行きます。その間に発砲するのに十分な時間が与えられます。 (ALL約束鎖が含まれるべきである).catch()に加えて、あなたを助けることができる

2つのことは:

process.on('uncaughtException', function(exception) { 
    console.log('uncaughtException', 'error', { message: exception.message, stack: exception.stack }); 
}); 

process.on('unhandledRejection', function(reason) { 
    console.log('unhandledRejection', 'error', reason); 
}); 

スクリプトの開始時にこれらのどこかを入れてください。どこが間違っていても、どこが間違っていても、あなたがそれをトラップしていなければ、(あなたがここにいるように)解く巨大な謎があるでしょう。これらの2つのトラップは、エラー状態を処理するのを忘れたときに追跡するのに役立ち、デバッグやヘッドスクラッチの時間を節約します。

+0

そう...私はばかだ。愚かな構文エラー。 'console.page(...)' 'block()'はうまく動きました。ありがとう。 'uncaughtException'についてのビットは、10秒で解決に至りました。 – daleyjem

関連する問題