2017-03-21 14 views
0

私は奇妙な問題に遭遇しています。 IPアドレスからジオロケーションを検索するモジュールを使用しています。ルックアップ方法は、デフォルトでsyncです。プロミスは解決も拒否もされていません。これの理由は何でしょうか?

ブルーバードを使用してメソッドを非同期に変換しましたが、その約束は決して解決または拒否されません。上記のスニペットで

var Promise = require('bluebird'); 
var geoip = Promise.promisifyAll(require('geoip-lite')); 


geoip.lookupAsync('52.39.138.72').then((r) => { 
    console.log(r); 
}).catch((err) => { 
    console.log(err); 
}) 

console.log(geoip.lookup('52.39.138.72').country + '^^^^'); 

、最後console.logが常に印刷されますが、thenまたはcatch内部の文のどちらが実行されます:ここで

はスニペットです。これの理由は何でしょうか?

+0

約束もコールバックも関数を非同期に変換しません。 – slebetman

+0

これを参照:http://stackoverflow.com/questions/25500466/asynchrous-callback/25500753#25500753これと:非同期的に - なぜ - 29885509#29885509 asyncが本当に何であるかを理解する – slebetman

答えて

2

上記のスニペットでは、最後のconsole.logは常に出力されますが、thenまたはcatchのいずれのステートメントも実行されません。これの理由は何でしょうか?

あなたが約束しようとしている機能は、要求された非同期呼び出し規約に従わないため、このようにして、このように約束することはできません。

Bluebirdの約束が正しく機能するようにするには、promiseする関数がnode.js非同期呼び出し規約に従わなければなりません。つまり、関数は最後の引数としてコールバックを取らなければならず、操作が完了すると、2つの引数errとでコールバックを呼び出さなければなりません。関数がこの規約に従わない場合、それを宣言することは機能しません。

そして、実際には同期操作を行い、それを約束する理由はありません。それを宣言することで、突然その機能が非同期になることはありません。

したがって、基本となる関数が適切な呼び出し規約で呼び出されるコールバックを使用しないため、約束が解決または拒否されることはありません。

したがって、geoip.lookup('52.39.138.72')が完全に同期していて、このように呼び出された場合、基礎となる操作は非同期ではないので、それを約束しようとする理由はありません。

あなたが実際にどのような問題を約束して解決しようとしているのかを説明すると、別の方法(おそらく新しい質問)を提示する可能性があります。スタックオーバーフローについて覚えておいてください。実際の問題を記述し、解決策を1つ試して問題を尋ねるのではなく、関連するコードを表示すると、私たちはあなたを助け、最良のソリューションを提供できる可能性がますます高くなります。

+0

私は一度に1行ずつファイルを連続的に読み込んでいます。そして、私は解析された行から2つの条件を検出したい。 IPの場所を検出することが条件の1つです。しかし、私は約束を管理することができないと思う。これは、2つのファイル 'index.js'と' lib/parser.js'を含む小さなサンプルです。https://github.com/suhailgupta03/Near-Real-Time-Threat-Detection –

+0

[CONTD。]私は特に、すべての約束が解決された後、結果をクライアントに送り返したいと思っています。 –

+0

@SuhailGupta - 私は私がそう思っています。あなたが最初に尋ねた質問に答えました。あなたが参照したコードについて別の質問がある場合は、新しい質問を投稿し、解決しようとしている正確な問題を記述し、関連するコードを質問に貼り付け、観察していることとコードで何を望みどおりに記述するべきですあなたが持っている。それはこの質問の範囲外です。 – jfriend00

関連する問題