为什么这个函数没有返回任何东西?

时间:2013-03-17 18:42:56

标签: javascript jquery javascript-events

我正在尝试调试一些测试 - 我有以下代码:

test('Can get the test Side',
        function () {
            stop();
            debugger;
            var result = getTestSide();
            debugger;
            changeTestSide(result);
        }
    );


    // Step 1: Get test side
    function getTestSide() {
        $.ajax({
            type: 'GET',
            url: urlWithId,
            success: function (result) {
                return "test success";
                debugger;
                ok(true, "GET succeeded.");
                if (!result.SideId === testSideId) {
                    throw "GET result does not equal testSideId";
                } else {
                    ok(true, "Returned key matches testSide Id.");
                    return result;
                }
            },
            error: function (result) {
                return "test failure";
                debugger;
                throw "Error";
            }
        });
    };

无论如何,top方法中的“结果”始终是未定义的。为什么是这样?无论getTestSide成功还是失败,我都会返回一个字符串。

3 个答案:

答案 0 :(得分:0)

您应该从changeTestSidesuccess处理程序中调用error方法

答案 1 :(得分:0)

你需要在这里解决一些问题:

success: function (result) {
    return "test success";
    debugger;
    ok(true, "GET succeeded.");
    if (!result.SideId === testSideId) {
        throw "GET result does not equal testSideId";
    } else {
        ok(true, "Returned key matches testSide Id.");
        return result;
    }
},

首先,您需要从AJAX中的changeTestSide(result);函数调用success。这是因为AJAX默认是异步调用,这意味着您的javascript在继续getTestSide()函数之前不会等待test完成执行。其次,在你的success函数中,你要做的第一件事是return "test success";,它将使函数返回,并且下面没有任何代码实际上正在运行。以下是代码需要的更好示例:

success: function (result) {
    debugger;
    ok(true, "GET succeeded.");
    if (!result.SideId === testSideId) {
        throw "GET result does not equal testSideId";
    } else {
        ok(true, "Returned key matches testSide Id.");
        changeTestSide(result);
    }
},

答案 2 :(得分:0)

在嵌套return中使用function仅从该函数返回。您的代码结构必须完全不同,以获得您想要的效果。一种方法是将回调函数传递给将处理响应的getTestSide,如下所示:

test('Can get the test Side',
    function () {
        stop();
        debugger;
        getTestSide(function (result) {
            changeTestSide(result);
        });
    }
);


// Step 1: Get test side
function getTestSide(cb) {
    $.ajax({
        type: 'GET',
        url: urlWithId,
        success: function (result) {
            // removed this because it stops the rest from running
            // return "test success";
            ok(true, "GET succeeded.");
            if (!result.SideId === testSideId) {
                throw "GET result does not equal testSideId";
            } else {
                ok(true, "Returned key matches testSide Id.");
                // Call the callback instead of returning.
                cb(result);
            }
        },
        error: function (result) {
            // removed this because it stops the rest from running
            // return "test failure";
            debugger;
            throw "Error";
        }
    });
};

您还在成功和错误回调中使用了throw;这些也不会做我认为你期望他们做的事情,因为当这些函数运行时你的测试函数已经返回,所以没有办法捕获这些异常。您的代码未显示任何尝试捕获异常,因此我没有尝试解决此问题,但您可以通过遵循与$.ajax函数类似的模式并同时提供success和然后调用者可以实现error回调。