从异步JavaScript方法返回值?

Kev*_*vin 9 javascript methods asynchronous return

我遇到了一个问题,我似乎无法从我在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);
 });
Run Code Online (Sandbox Code Playgroud)

我能够访问来自'onload'事件的值,但我似乎无法返回实际值.我试过这个:`

function create_blob(file) {
    var reader = new FileReader();
    reader.onload = (function() { return function(e) { return e.target.result; }; })();
    reader.readAsDataURL(file);
}
Run Code Online (Sandbox Code Playgroud)

每次执行此函数时,'blob_str'变量的值都是'undefined',大概是因为赋值是在函数完成之前完成的.我真的不确定如何解决这个问题.有没有办法可以从这个函数返回这个值?

mu *_*ort 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);
}
Run Code Online (Sandbox Code Playgroud)

这种类型的chicanery是非常标准的异步调用(特别是AJAX).你可以将一些脆弱的计时器连接起来同时试图用力,但是对抗API的自然风格是一场失败的战斗.