【问题标题】:JavaScript callback values not correctly passedJavaScript 回调值未正确传递
【发布时间】:2013-05-07 17:29:03
【问题描述】:

我在将常量值传递给回调函数时遇到了一些问题。我正在使用ajax 执行 RESTful 请求,然后通过将数据返回到插入常量的回调来处理 errorsuccess 事件第一个参数(SUCCESS 或 ERROR),并将其返回给另一个回调侦听器。唯一的问题是这些新添加的第一个参数没有正确添加(甚至根本没有添加)。我在错误所在的代码中添加了注释。 Here is the fiddle.

(function( REST, $, undefined) 
{

    REST.get = function(_url, _data, _onSuccessCallback, _onErrorCallback)
    {
        console.log("GET");

        $.ajax({
            type:       'GET',
            url:        _url,
            data:       _data,
            dataType:   'json',
            headers:    {contentType: 'application/json'},
            success:    _onSuccessCallback,
            error:      _onErrorCallback
        });

    };
}
(window.REST = window.REST || {}, jQuery));


(function( DSP, $, undefined) 
{
    var baseURL = "www.example.com";

    /** The request was successful */
    DSP.SUCCESS = 0;
    /** The request failed */
    DSP.ERROR = 1;

    DSP.get = function(url, _data, callback)
    {
        REST.get(url, 
                _data, 
                function(data, text)
                { 
                    console.log("Success. arg0 = " + DSP.SUCCESS);
                    callback.call(DSP.SUCCESS, data, text);
                },
                function(request, status, error)
                {
                    //So far, it's just errors. 
                    console.log("\nError. arg0 = " + DSP.ERROR);//This prints "Error. arg0 = 1"
                    for (var i = 0; i < arguments.length; i++)
                    {
                        console.log(arguments[i]);//prints the request Object and the text "error"
                    }
                    callback.call(DSP.ERROR, request, status, error);//doesn't seem to correctly insert the ERROR constant.
                }
        );
    };


    DSP.getSomething = function(callback) 
    {
        console.log("Get something");
        var url = baseURL + "/Something";
        DSP.get(url, null, function(){
            console.log("ARGUMENTS LENGTH = " + arguments.length);//prints 3
            for (var i = 0; i < arguments.length; i++)
            {
                console.log(arguments[i].toString());//prints all same Objects as above
            }
            if (arguments.length < 1) {
                console.error("error in request");
                callback.call(null);
            }
            if (arguments[0] == DSP.ERROR)//should get to here. Why doesn't it???
            {
                var request = arguments[1];
                var status = arguments[2];
                var error = arguments[3];
                console.error("Failed To Get Something (" + request.responseText + ")");
                callback.call(null);
            }
            else if (arguments[0] == DSP.SUCCESS)
            {
                var data = arguments[1];
                var text = arguments[2];

                callback.call(data);
            }
            else
            {
                //gets to this line and prints "arguments[0] ([object Object]) != SUCCESS(0) !=ERROR(1)."
                console.log("arguments[0] (" + arguments[0].toString() + ") != SUCCESS(" + DSP.SUCCESS + ") != ERROR(" + DSP.ERROR + ").");
                console.error("internal error");
                callback.call(null);
            }
        });
    };
}
(window.DSP = window.DSP || {}, jQuery));

window.DSP.getSomething(function(response){
    if (!response)
    {
        //this is printed.
        console.log("error. No user returned.")
    }
    else
    {
        console.log("RESPONSE: " + response.toString());
    }
});

我做错了什么? REST 中的错误应该导致DSP.getDSP.ERROR 参数作为第一个参数,这应该由getSomething 处理。

【问题讨论】:

    标签: javascript ajax rest callback


    【解决方案1】:

    改变这个:

    callback.call(DSP.ERROR, request, status, error);
    

    到这里:

    callback(DSP.ERROR, request, status, error);
    

    当您使用.call() 调用函数时,.call() 的第一个参数设置您正在调用的函数的this 值。 .call() 的第二个参数设置函数的第一个参数,以此类推...


    同样适用:

    callback/*.call*/(DSP.SUCCESS, data, text);
    

    还有这些:

    callback/*.call*/(null);
    callback/*.call*/(data);
    

    因为您的回调似乎预计接收数据作为第一个参数。

    【讨论】:

    • 谢谢!这为我省去了很多无用的调试!
    猜你喜欢
    • 1970-01-01
    • 2020-12-07
    • 2016-02-07
    • 1970-01-01
    • 2012-07-05
    • 2012-10-19
    • 2013-08-31
    • 1970-01-01
    • 2011-12-25
    相关资源
    最近更新 更多