私はフォーム内でPlupload file uploaderを使用しています。フォームを送信したとき、つまり[送信]ボタンをクリックしたときに最初に起こるのは、ファイルのアップロードとそれに続くフォームの提出です。jQuery.Deferredオブジェクトを使用して非同期関数呼び出しが完了するまで待機するにはどうすればよいですか?
私には分かりますが、これは間違っているかもしれませんが、uploader.start()
という呼び出しは非同期関数呼び出しであるようです。したがって、現時点では、アップロードが開始され、ファイルがアップロードされる前にフォームが送信されます。問題は、私はこの関数呼び出しを制御できないことです。
私は最近、new release of jQuery 1.5と新しいDeferred Objectについて読んだことがあります。これは、この問題を解決するのに役立つ可能性があるようです。非同期関数呼び出しが終了し、呼び出し後にコードの実行を続けるのを待つ方法はありますか?すべてのファイルができるように、だから私は、
var uploader = $('#plupload_container').pluploadQueue();
$('#submitButton').click(function() {
// if there are files to be uploaded, do it
if (uploader.files.length > 0) {
// make the call and wait for the uploader to finish
uploader.start();
while (the uploading is not done) {
wait for the uploader to finish
}
// continue with submission
}
});
は、基本的にクリックイベントハンドラに一時停止を入れて、仕上げにuploader.start()
ため、「待つ」ことがある方法です...以下の擬似コードのようなものを探しています最初にアップロードしてから、クリックイベントハンドラの残りの部分を実行し終えることができますか?私は、ファイルをアップロードして行われる前に「完了」など、
$.when(uploader.start()).then(function() {
console.log("done")
});
情報の別の有用な部分は...私はこのuploader
オブジェクトインスタンスに特定のイベントをバインドすることができます...印刷され、次が、試してみました」 UploadProgress "または" UploadComplete "を選択します。 Deferred Objectを何らかの方法で使用して、「UploadComplete」イベントが発生したときなどに捕捉できますか?これを行うAJAX-yの方法はありますか?
ありがとうございました。
@レイノス...返事をありがとう。これはすばらしく見えますが、ソースコードを変更することは考えていませんでしたが、それは素晴らしいアイデアです!私はオフィスに戻って何が起こったのかを知らせるときにこれを試してみます。 – Hristo
@hristoあなたはソースコードを変更するよう提案していません。私はあなたがイベントを使用することをお勧めします。また、必要な場合は、イベントを遅延オブジェクトと組み合わせることもできます。サードパーティのライブラリを使用していることは、ソースコードを変更していないことです。この方法で、バグを修正して改善をもたらすコードの新しいリリースに頼ることができます – Raynos
@Raynos ...あなたは良い点を作っています。だから私はあなたの例を読んで、それはよさそうだ。私はそれを試してみますが、私は質問があります... Deferredオブジェクトのあなたの例は、 '.click()'イベントハンドラを一時停止し、 'def.done()'の終了後に続行しますか?クリックイベント全体?そうであれば、 'event.preventDefault()'のように呼び出すと、クリックを一時停止し、 'def.done()'の実行後に何らかの方法でそれを続けますか? – Hristo