2013-11-29 89 views
0

有沒有辦法在沒有全局變量的函數內等待異步操作?函數內部的JavaScript延遲,沒有全局變量

我知道,如果我有一個全球性的,我可以延遲這樣的:

var flag = 0; // global 

function wait_for_convert() { 
    if(!flag) { 
     setTimeout(wait_for_convert, 50); 
    } 
    else { 
     request.send(data); 
    } 
} 
wait_for_convert(); 

但是,如果我有很多異步操作,這是非常討厭把所有這些等待的全球範圍。

比如我需要返回數據的功能,從異步請求,就像這樣:

function append_resized(resized_images, name, file) 
{ 
    var reader = new FileReader(); 
    reader.onload = function(e) { 
     var img = document.createElement("img"); 

     img.onload = function() { 
      var dataurl = dataurl_resize(this); 

      // WOULD BE NICE TO RETURN THIS RESULT 
      // LIKE THIS: return {'blob': dataURLtoBlob(dataurl), 'filename': file.name}; 
      resized_images[name] = {'blob': dataURLtoBlob(dataurl), 'filename': file.name}; 
     }; 
     img.onerror = function() { 
      resized_images[name] = undefined; 
     } 
     img.src = e.target.result; 
    }; 
    reader.readAsDataURL(file); 
} 

也可能是有庫鎖定異步請求同步,還是其他什麼東西?

+0

看看IcedCoffeeScript:http://maxtaco.github.io/coffee-script/ – Chris

回答

2

您可以使用回調,實際上我建議只有這種解決方案(你有多少個標誌可以有?):

function afterSomething() { 
    request.send(data); 
} 

這個回調可以被傳遞到另一個函數,並引發從那裏:

function doSomething(callback) { 
    // do something 
    callback(); 
} 

doSomething(afterSomething); 

這樣做,您可以創建回調鏈,存在於不同範圍內,等等。這是多麼強大的功能編程。

所以要根據您的例子,你可以做某事像這樣:

function onLoadCallback(name) { console.log(name); } 

function append_resized(resized_images, name, file, onLoadCallback) { 
    ... 
    img.onload = function() { 
     var dataurl = dataurl_resize(this); 

     // WOULD BE NICE TO RETURN THIS RESULT 
     // LIKE THIS: return {'blob': dataURLtoBlob(dataurl), 'filename': file.name}; 
     resized_images[name] = {'blob': dataURLtoBlob(dataurl), 'filename': file.name}; 

     onLoadCallback(name); // you can pass whatever you want and need of course 
    }; 
    ... 
} 

希望它能幫助!

+0

我想我明白了。 對於我的函數「append_resized」,這意味着我必須在參數中添加「回調」函數,並且此「回調」檢查所有resized_images [名稱],如果一切正常,則發送請求。 (PS:此功能調整了幾張圖片的大小,所有這些圖片都通過異步請求調整大小,而我必須等待1..20張圖片纔會被調整大小) – xwild

+0

@kwild我剛剛編輯了我的解決方案以向您展示方式如何在你的情況下使用回調。 – Karol