Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从异步JavaScript方法返回值?_Javascript_Asynchronous_Methods_Return - Fatal编程技术网

从异步JavaScript方法返回值?

从异步JavaScript方法返回值?,javascript,asynchronous,methods,return,Javascript,Asynchronous,Methods,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); }); create_blob(f

我遇到了一个问题,似乎无法从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);
 });
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);
}
我能够访问来自“onload”事件的值,但似乎无法返回实际值。我试过这个:`

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

每次执行此函数时,“blob_str”变量的值都是“未定义”的,可能是因为赋值是在函数完成之前完成的。我真的不知道该怎么做。有没有办法从这个函数返回这个值

您最好将回调传递给
create\u blob
,让回调执行任何需要执行的操作,如下所示:

$(document).ready( function() {
$('#splash_image_upload').change( function() {
    var file = this.files[0];
    var blob_string = create_blob(file);
    alert(blob_string);
 });
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);
}

这种诡计对于异步调用(特别是AJAX)来说是相当标准的。您可以连接一些脆弱的计时器,以尝试同步强制,但与API的自然风格作斗争是一场失败的战斗。

这是回调的问题。“答案”将在稍后的某个时刻出现,而不是在方法评估期间。在这里回来没什么用

回调需要处理返回值,使代码看起来更复杂:

reader.onload = function(e) { 
  // handle here the result
  // do something with e.target.result
};

哇,谢谢。我从没想过。我只是认为可以在onload()函数中返回值,但是函数是异步的,所以它在函数完成之前返回!非常感谢!相关的: