【问题标题】:Object return needs to wait until JSON request is finished对象返回需要等到JSON请求完成
【发布时间】:2010-12-19 08:40:54
【问题描述】:

这里是get.json的内容:

{ "id" : 1, "name" : "你好" }

和脚本/标记:

var 条目 = [];

       function Data(){}
       Data.prototype.get = function(id){
            var object = {}, length = entries.length, success = false;
            for (var i = 0; i < length; i++) {
                if (entries[i].id == id) {
                    object = entries[i];
                    i = length;
                    console.log("From browser: " + object.name);
                    success = true;
                }
            }
            if (!success) {
                $.getJSON("get.json", function(data){
                    entries.push(data);
                    object = data;
                    console.log("Newly fetched: " + object.name);
                });
            }
            return object;
        }

        $(function(){
            var data = new Data();
            data.get(1);
            console.log((data.get(1).name);
        });

【问题讨论】:

    标签: javascript jquery json oop object


    【解决方案1】:

    我会使用回调。如果数据存在于浏览器缓存中,将立即触发回调。如果不是,它将在异步请求完成时触发。

    function Data(){}
    Data.prototype.get = function(id, callback){
         var object = {}, length = entries.length, false;
         for (var i = 0; i < length; i++) {
             if (entries[i].id == id) {
                 object = entries[i];
                 console.log("From browser: " + object.name);
                 callback(object);
                 return; // Don't let execution continue
             }
         }
    
         $.getJSON("get.json", function(data){
             entries.push(data);
             object = data;
             console.log("Newly fetched: " + object.name);
             callback(object);
         });
     }
    
     $(function(){
         var data = new Data();
         data.get(1, function(obj){
            console.log(obj.name);
         });
     });
    

    另一种方法是让您的 AJAX 调用同步,这会暂停所有执行,但这是一个非常坏主意

    编辑:我还稍微更改了您的代码以删除 success 变量,并选择直接从 for 循环返回(从而中断循环)。

    【讨论】:

    • 没问题。异步思维是思维的重大转变。每次我在使用它的项目上工作时,我都必须停下来思考一下!
    猜你喜欢
    • 2016-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 2021-11-13
    • 2020-07-22
    相关资源
    最近更新 更多