Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/85.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
文件API Javascript文件读取器onload_Javascript_Jquery_Promise_Jquery Deferred_Fileapi - Fatal编程技术网

文件API Javascript文件读取器onload

文件API Javascript文件读取器onload,javascript,jquery,promise,jquery-deferred,fileapi,Javascript,Jquery,Promise,Jquery Deferred,Fileapi,我将文件API与Javascript一起使用。 我需要等待onload方法的完成,我怎么做 reader.onload = function (e) { contents = reader.result; var addAttchCallBack = loadRequestExecutor(); addAttchCallBack.done(function (data) { alert("ok"); }) }; alert("Ko"); 我


我将文件API与Javascript一起使用。
我需要等待onload方法的完成,我怎么做

reader.onload = function (e) {
    contents = reader.result;
    var addAttchCallBack = loadRequestExecutor();
    addAttchCallBack.done(function (data) {
        alert("ok");   
    })
};
alert("Ko");
我总是在“Ko”之前看到 注意:函数loadRequestExecutor()正确地返回承诺对象。

谢谢,Nk

你真的需要研究异步行为和回调,然后开始理解
承诺,因为你的例子是回调和承诺的奇怪组合,但是,为了尝试用基本术语解释发生了什么:

例1: 您总是先看到
KO
,因为第一个示例是这样做的:

  • 将函数指定给稍后将回调的属性
  • 显示KO警报
  • 文件加载后,启动执行器,执行器在完成时(如果有)发出OK警报
  • 因此,基本上您的
    onload
    函数只会在文件加载后(异步)被调用,因此下一行的
    alert
    会立即执行

    例2: 您在评论中的第二个示例是:

    $.when(reader.onload = function (e) {
        contents = reader.result;
        return loadRequestExecutor();
    }).done(function (a) {
        alert("ok");
    });
    alert("KO");
    
    也就是说:

  • 将函数指定给稍后将回调的属性
  • 时,将相同的函数传递给
    ,但不要执行它
    
  • 显示KO警报
  • 稍后加载文件时,将loadRequestExecutor()返回给filereader 最终的结果是不会将承诺返回等待,这可能是您的意思,因此它永远不会像预期的那样工作

    建议:

    我不太了解这些插件,但是如果您想等待,您似乎需要记录一个与加载请求执行器相关的承诺

    // Create the loadRequestExecutor and record the promise
    var addAttchCallBack = loadRequestExecutor();
    
    // Setup the onload callback  
    reader.onload = function (e) {
        contents = reader.result;
        alert("ok - file load is done");   
    };
    
    // Listen for the loadRequestExecutor to complete
    addAttchCallBack.done(function (data) {
        alert("Ko - loadRequestExecutor is done");
    })
    
    alert("I am just an alert that will happen first, as everything above is asynchronous!");
    

    从这个问题上看,您的总体目标并不明确,因此这个答案主要集中在举例说明为什么您的两次尝试都没有达到预期效果。

    return addAttachCallBack。然后(function(data){alert(“ok”);return data;})`您需要返回承诺。另外,假设您已经知道JS中的异步编码是如何工作的—您是否已经阅读了“将回调api转换为承诺”问题?问题是,onLoad是异步的。我尝试了$.when(reader.onload=function(e){contents=reader.result;return loadRequestExecutor();}).done(function(a){alert(“ok”);});警惕(“KO”);