JavaScript表示Object中定义的变量未定义

时间:2014-03-23 03:11:13

标签: javascript php jquery ajax

我一直在搞乱我发现的{Ajger上传教程here。我正在尝试检查服务器是否返回"error"作为状态。我发现了它,它是data.result。当console.log(data)定义data时,result按预期{"status":"error"},但当我尝试在同一函数中调用data.result时,它会返回undefined 。我尝试了所有的东西,当它没有被定义时,在全局变量中定义它,甚至将它传递给另一个函数。这就是我所拥有的:

    progress: function(e, data){
        // calc the completion percentage of the upload
        var progress = parseInt(data.loaded / data.total * 100, 10);
        console.log(data);
        /* console log:
            Object {disabled: false, create: null, dropZone: b.fn.b.init[1], pasteZone: b.fn.b.init[1], replaceFileInput: true…}
            (more values)
            result: "{"status":"error"}"
            (more values)
        */
        // update hidden input field and trigger a change
        data.context.find('input').val(progress).change();

        if(progress == 100){
            updateProgress(data);
        }
    },

// ... later on in the file ...

function updateProgress(data){
    console.log(data);
    if(JSON.parse(data.result).status === 'error'){
        data.context.addClass('error');
    }else{
        data.context.removeClass('working');
        $('#drop').fadeOut(function(){
            $('#drop').remove();
            if(debug === 0){window.location = 'http://datastorage.iquestria.net/images/'+data.files[0].name+'?v2';}
        });
    }
}

2 个答案:

答案 0 :(得分:0)

经过多次讨论后,最终的问题是data.result仅在done回调中可靠,而不是在OP试图访问它的progress回调中。


Ajax调用的结果只能用于提供数据的回调。你不能在其他任何地方使用它。这是因为回调是异步调用的,并在函数的其余部分完成后的某个时间结束。

有关详细信息,请参阅此答案:How do I return the response from an asynchronous call?


另外,如果你正确使用jQuery的ajax调用,你不应该自己做任何JSON解析,因为jQuery会为你做所有这些。我并不完全明白你得到的结果是什么,但是如果你为ajax调用指定了正确的数据类型结果,jQuery会自动为你解析它并且你不会得到它必须自己致电JSON.parse()

答案 1 :(得分:0)

查看代码,看起来像是

JSON.parse(data.result).status

应该是

JSON.parse(data).result.status

如果'结果'是JSON响应的一部分。就像你的JSON是result: {"status":"error"} result一样,在你解析data之前,它是不可用的。