2016-03-23 6 views
0

私は誰かが私を助けてくれることを願ってjsの約束に問題があります。以下の関数myFunctionは$ .ajax呼び出しを実行し、したがって約束を返します。

のMyFunction(再帰的に)今、Aを返す
var nextBitOfWork = function() { 
    return myFunction(email); 
}; 
setTimeout(nextBitOfWork, 0); 

:私は再帰として、以下のように、この機能の更新は、私がのsetTimeoutを呼んでいることにリフレッシュのdivを表示するために、ブラウザに手制御をする必要としてそれが終わったら約束する$ .ajaxコールです。

私は単純に呼び出す場合:

return myFunction(email); 

をsetTimeout関数ことなく、上記の構築、約束を通過し、すべての私の約束がキャプチャされていると私は私が必要とするアレー出力を取得することができ、いつ再帰すべてが素晴らしい作品終了する。しかし、setTimeoutがなければ、私はブラウザの更新を取得しません。上記のように使用すると、div更新のリフレッシュが表示されますが、約束を失うように見えるので、スクリプトが続行され、myFunctionが再帰的に構築する配列を埋めることはできません。

setTimeoutが確実にプロミスに合格するようにするための考えは、私がレスポンス配列を作成し、div更新を表示するようにしていますか?

ご協力いただきありがとうございます。

OK - 今、次があります。

var func = function() { 
    myFunction(email); 
}; 
return refreshscreen(func,0); 

refreshscreenは次のとおりです。

function refreshscreen(func,time) { 
    var timer = $.Deferred(); 
    setTimeout(function() { 
     return func().then(timer.resolve()); 
    }, time); 
    return timer.promise(); 
} 

まだ同じ問題 - ブラウザのdiv、私は収集のためのMyFunctionでビルド配列をレンダリングするものの、 $ .ajaxレスポンスは長さが1要素だけですが、20回繰り返されます!リフレッシュ画面を呼び出さなければ、配列はうまくいきますが、ブラウザはdivを再描画することはありません!

+1

(最終的には必要に応じて)代わりにコールバックを使用してリクエストをキューイングするのはどうですか? – briosheje

+0

非常に大規模なコードが書き直してしまうことを意味します。これは約束では可能ですが、それを処理するsettimeoutをどのように構築するかはわかりません! –

+0

あなたの編集では、 'func'は' myFunction'から受け取った約束を返す必要があります。 ( 'setTimeout'の中の' return'も削除することができます) – csum

答えて

1

setTimeoutは、あなたが渡す関数が返す値を返しません。(それはあなたがclearTimeoutにそれを渡すことによって、タイムアウトを停止するために使用できる値を返します)

ので、戻り値を受け取るためにmyFunctionから、setTimeoutの呼び出しの関数でラップするだけです。

setTimeout(function() { 
    var promise = myFunction(email); 
    // do something with promise... 
}, 0); 
+0

役立つ@csum - ありがとう! –