我遇到了一个问题,我似乎无法从我在Jquery中运行的异步JavaScript方法中获取值。我的Jquery看起来像这样:
$(document).ready( function() {
$('#splash_image_upload').change( function() {
var file = this.files[0];
var blob_string = create_blob(file);
alert(blob_string);
});
我能够访问来自'onload'事件的值,但我似乎无法返回实际值。我试过这个:`
function create_blob(file) {
var reader = new FileReader();
reader.onload = (function() { return function(e) { return e.target.result; }; })();
reader.readAsDataURL(file);
}
每次执行此函数时,'blob_str'变量的值都是'undefined',大概是因为赋值是在函数完成之前完成的。我真的不确定如何解决这个问题。有没有办法可以从这个函数返回这个值?
答案 0 :(得分:23)
最好的办法是将回调传递给create_blob
并让回调做任何需要做的事情,如下所示:
create_blob(file, function(blob_string) { alert(blob_string) });
function create_blob(file, callback) {
var reader = new FileReader();
reader.onload = function() { callback(reader.result) };
reader.readAsDataURL(file);
}
这种类型的chicanery非常适合异步调用(特别是AJAX)。你可以用一些同样的力量来计算一些脆弱的计时器,但是对抗API的自然风格是一场失败的战斗。
答案 1 :(得分:0)
这是回调的问题。 “答案”将在另一个时刻发生,而不是在评估方法时发生。很少有人在这里回来。
您的回调需要处理返回值,使代码看起来更复杂:
reader.onload = function(e) {
// handle here the result
// do something with e.target.result
};