2016-03-23 85 views
0

我有一個js promise的問題,希望有人能幫助我。下面的函數myFunction執行$ .ajax調用,因此返回一個承諾。因爲我需要手動控制返回給瀏覽器以顯示刷新的div這一功能更新,我遞歸,我稱爲的setTimeout如下:

var nextBitOfWork = function() { 
    return myFunction(email); 
}; 
setTimeout(nextBitOfWork, 0); 

其中myFunction的(這遞歸)現在返回承諾完成之後再做$ .ajax調用。

如果我只需撥打:

return myFunction(email); 

沒有setTimeout函數構造以上,承諾通過傳遞和我所有的承諾被捕獲並讓我得到陣列輸出我需要的,一切都很正常,當遞歸結束。但是如果沒有setTimeout,我不會刷新瀏覽器。像上面那樣使用它,我得到了div更新刷新顯示,但似乎失去了承諾,所以腳本繼續下去,我不能填充myFunction在遞歸時構建的數組。

有關如何確保setTimeout可靠地傳遞承諾,以便構建響應數組並顯示div更新的任何想法?

非常感謝您的幫助!

確定 - 現在有以下:

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(s)來處理它! –

+0

在您的編輯中,'func'需要返回從'myFunction'收到的許諾。 (你也可以在'setTimeout'內刪除'return') – csum

回答

1

setTimeout不返回由您在傳遞函數的返回值。(它返回一個值,你可以用它來停止超時被傳遞到clearTimeout

因此,爲了接收返回的值從myFunction只是將它包裝在您調用setTimeout的函數中。

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

有用的@csum - 謝謝! –