-1

このコード例では、関数logout()はすべての非同期呼び出しを実行せず、終了するまで待機しません。代わりにページがアンロードされます。 beforeunloadイベントによってページがアンロードされます。私が試してみたい何遅延非同期関数の待機(beforeunloadイベント)

$(window).on('beforeunload', function(event) { 
    event.preventDefault(); 
    logout(); 
    return; 
}); 

logout()のいくつかの非同期呼び出しが完了した後にイベント関数が戻るということです。

編集:私の目標はではありませんこれにアラートを表示する!私はページがアンロードされる前にいくつかのコードを実行したいだけです。ログアウト関数には、終了する必要のある持続時間を持つajaxリクエストとjQueryアニメーションが含まれている可能性があります。

私はコールバックを試しましたが、これはコールバックに戻ってきたもので、目的の結果でないものは、イベント関数ではありません。

$(window).on('beforeunload', function(event) { 
    event.preventDefault(); 
    logout(function(x) { return; }); 
}); 
+0

ページを閉じるときにjquery beforeunloadの複製がありますか?](http://stackoverflow.com/questions/18783535/jquery-beforeunload-when-closing-not-leaving-the-page) –

+0

@ E.Mouritsいいえ、あなたは私の質問を読んだことがありますか?離脱とナビゲートの区別とは関係ありませんが、ページがアンロードされる前にコードを実行するか、新しいページがロードされます。 – ScientiaEtVeritas

+0

私が知る限り、ユーザーがあなたのページを離れないようにすることはできません。可能な重複はあなたが望むものに最も近いと思った答えです。 –

答えて

-2

本当にクリーンなソリューションではありませんが、ログアウトの進行中にコードを強制的に待機させるようにsetTimeoutを試すことができます。

var timeToLogoutInMs = 500; 
setTimeout(function() { 
    // Nothing 
}, timeToLogoutInMs); 

EDIT:なぜbeforeunloadフックでこれを行う必要がありますか?手動オプションのユーザーをログアウトするように設定してみませんか?

+0

私が知る限り、setTimeoutは非同期に実行されます。つまり、次のステートメント(戻り値)をすぐに続けることを意味します。ログアウトは単なる例であり、実際にはGoogle Chrome拡張機能に関するものです。私はページにいくつかのコードを挿入し、ページがアンロードされる前に何かを表示したい。 – ScientiaEtVeritas

+0

これは動作を変更しません。 –

+0

うーん、私は参照してください。同じフックでアラートを呼び出すとどうなりますか?アラートポップアップでアンロードが一時停止するのでしょうか? – tetutato

1

ページがアンロードされたときにページ上で実行されたすべてが無効になるため、ページ自体に依存して非同期呼び出しを完了することはできません。

クロムエクステンションの場合は、1ページのバックグラウンドページを使用しています。 beforeunloadハンドラー内のバックグラウンドページにメッセージを送信し、対処する必要があるすべての情報を取得し、バックグラウンドページで非同期呼び出しを実行するだけです。サンプルコードは次のようになります。chrome.runtime.onMessage.addListenerのとき無効になるので、

window.addEventListener('beforeunload', function() { 
    chrome.runtime.sendMessage({ info: "Here is the info you would like to pass to background page"}); 
}); 

background.js

chrome.runtime.onMessage.addListener(function(request) { 
    // The following is your async call 
    logout(); 
    // Don't forget the following code 
    return true; 
}); 

は、背景ページにイベントリスナーからtrueを返すのを忘れないでください

content.jsイベントリスナーが返されます。詳細はthis answerを参照してください。

+0

これはバックエンドタスクのための良いアイデアです。しかし、私はバックグラウンドスクリプトから何かを、たぶんchrome.tabs.executeScriptで見せてもらえますか?しかし、私はそれもリフレッシュされると思います。 – ScientiaEtVeritas