6

コード例:

var connection = null;

function onConnect(status) {
    im_a_big_error.log('wtf');
    // Why it doesn't throw me an error here ??                                                                                                                                                                                                
}

$().ready(function() {
    connection = new Strophe.Connection('http://localhost:8080/http-bind');
    connection.connect('admin@localhost', 'admin', onConnect);
});

Chrome コンソールにエラーは表示されません。

この問題を解決するアイデアはありますか?

4

4 に答える 4

4

はい、ストローフィはエラーを飲み込みます。悪い; エラーがスローされた後、コールバックは本来のようにtrueを返さず、stropheはハンドラーを削除します。エラーが発生するとすぐに、コールバックが再度呼び出されることはありません。

現在の回答のコードは少し使いにくいと思いました。内部的には、すべてのコールバックに次のラッパーを使用します。

function callback(cb) {
// Callback wrapper with
// (1) proper error reporting (Strophe swallows errors)
// (2) always returns true to keep the handler installed
return function() {
    try {
        cb.apply(this, arguments);
    } catch (e){
        console.log('ERROR: ' + (e.stack ? e.stack : e));
    }

    // Return true to keep calling the callback.
    return true;
};
}

このラッパーは、質問のコードで次のように使用されます。

connection.connect('admin@localhost', 'admin', callback(onConnect));
于 2012-11-07T14:09:07.107 に答える
0

私はしばらく Strophe を使っていましたが、必要に応じてデフォルトのエラー処理ルーチンを変更する必要がありました。

  • Strophe.js -log関数 - デフォルトでは何も含まれていません - レベル === ERROR およびレベル === FATAL のサーバー側ロギング サービスへの呼び出しを追加しました
  • Strophe.js -run関数 - エラーのデフォルトの動作は、ハンドラーを削除してエラーを再スローすることです。サーバー側で既にエラーをログに記録しているため、エラーを再スローせず、ハンドラーを保持することにしました (失敗した場合でも)。この動作は、独自の実装に応じて意味を成す (または意味しない) 可能性があります。私はカスタム メッセージを使用し、かなり複雑なメッセージ処理ルーチンを使用しているため、送信時にメッセージが適切にフォーマットされていなかったという理由だけでクライアントを停止させたくないので、エラーかどうかに関係なく、ハンドラーを保持します。run 関数内の throw e 行を次のように置き換えます。result = true;
  • Strope.js _hitError- 前述したように、クライアントを切断したくないので、デフォルトの動作を書き直して、切断しないようにしました (エラー カウンターがどんなに高くても)。

これらの考えが他の人に役立つことを願っています-質問がある場合/詳細が必要な場合はコメントを残してください.

于 2012-10-22T11:29:40.207 に答える
0

上記の tsds によって提供されたアプローチを使用して修正した同様の問題がありました。ただし、最小限の変更で。2 つの接続メソッドを作成し、1 つはconnectとして、もう1 つはconnect_bakとして作成しました。スクリプトを配置しました。

this.connection._hitError=function (reqStatus) {
client.connect_bak();
};

私のconnectHandler関数と接続関数で。関数が接続時に常にバインドされるようにします。

于 2013-12-14T16:37:51.633 に答える