2015-05-24 109 views
0

工作我已經存儲了一些圖片,我走的價值是這樣的:與承諾的jQuery

var imgGaleria1 = $("#imgGaleria1")[0].files[0]; 
var imgGaleria1Blob; 

if (imgGaleria1) { 
    var reader = new FileReader(); 
    reader.onload = function (e) { 
     reader.readAsDataURL(imgGaleria1); 
     imgGaleria1Blob = e.target.result; 
    }; 
} 

但很明顯,我不能存儲到imgGaleria1Blob,因爲讀者僅async任務,我搜索到我需要做一個承諾,返回價值來存儲它,但我不明白承諾的工作原理。

有人可以向我解釋我怎樣才能執行此代碼到承諾並存儲結果(e.target.result)?

感謝您的幫助球員。

+0

您可以使用回調,但您已經擁有一個onload事件處理函數的回調函數。使用承諾並不會真正幫助您在加載之前訪問事物,它只是讓事情更容易從回調中移出,並且仍然等待事件發生。 – adeneo

回答

0

我需要做一個承諾返回我的值來存儲它

承諾不返回值,他們「含有」他們 - 一個承諾就是表示異步值的包裝,一指向未來。

,但我不明白的承諾是如何工作的

你絕對應該去的是將它們應用到你的代碼之前。你會發現一些好的資源herehttps://www.promisejs.org/

如何將此代碼執行到承諾並存儲結果?

看看How do I convert an existing callback API to promises?的一般方法。對於jQuery,您將構造一個Deferred object,稍後您可以解決該問題,並可立即爲該未來的價值承諾。

var dfd = $.Deferred(); 
var reader = new FileReader(); 
reader.onload = function(e) { 
    dfd.resolve(e.target.result); 
}; 
reader.readAsDataURL(imgGaleria1); 

promiseForImgGaleria1Blob = dfd.promise(); 

稍後您將能夠通過

promiseForImgGaleria1Blob.then(function(imgGaleria1Blob) { 
    // use the blob here 
}); 

消耗該值,但請注意,取決於這個值是異步的,現在應該成爲一個承諾,返回功能應有盡有。

+0

哇,對於所有人來說,這有助於我和你,幫助我更多地瞭解更多承諾的工作原理。我將更加關注他們的作品。 –