从函数javascript返回数组

时间:2014-09-25 10:47:32

标签: javascript jquery arrays return

我需要回复我的行为,但它不起作用

function getBehaviorList() {
    var behaviors = getBehaviors();
    console.log("Making behavior list");
    console.log(behaviors);
    $.each(behaviors, function (index, value) {
        if (value.indexOf("User/.lastUploadedChoregrapheBehavior") < 0) {
            $('#installedBehaviors tr:last').after('<tr><td>' + value.split('/').pop() + '</td><td><a href="#" class="btn btn-default" id="' + value + '"><span class="text-color-green glyphicon glyphicon-play-circle"></span> Start</a></td></tr>');
        }
    });
    $("#installedBehaviors a").click(function () {
        startBehavior(this);
    });
}
function getBehaviors() {
    console.log("Getting behaviors");
    session.service("ALBehaviorManager").done(function (behaviorManager) {
        behaviorManager.getUserBehaviorNames().done(function (behaviors) {
            behaviors;
            console.log(behaviors);
            return behaviors;
        });
    }).fail(function (error) {
        console.log("An error occurred: ", error);
    });
}

这是我在控制台中得到的错误

  

获取行为

     

制作行为清单

     

未定义

     

未捕获的TypeError:无法读取未定义的属性“长度”

     

[“User / .lastUploadedChoregrapheBehavior / test”,“User / actura-test / test”,“User / check-update”,“User / follow-me”]

剂量任何人都知道为什么?

2 个答案:

答案 0 :(得分:1)

您无法从函数内部的回调中间返回值。这很可能是一次异步调用(或两次出现)。

您可以使用延迟或承诺来执行此操作。这是一个使用回调的简单示例:

function getBehaviorList() {
    getBehaviors(function (behaviors) {
        console.log("Making behavior list");
        console.log(behaviors);
        $.each(behaviors, function (index, value) {
            if (value.indexOf("User/.lastUploadedChoregrapheBehavior") < 0) {
                $('#installedBehaviors tr: last ').after(' < tr > < td > ' + value.split(' / ').pop() + ' < /td><td><a href="#" class="btn btn-default" id="' + value + '"><span class="text-color-green glyphicon glyphicon-play-circle"></span > Start < /a></td > < /tr>');
            }
        });
        $("#installedBehaviors a").click(function () {
            startBehavior(this);
        });
    });
}

function getBehaviors(callback) {
    console.log("Getting behaviors");
    session.service("ALBehaviorManager").done(function (behaviorManager) {
        behaviorManager.getUserBehaviorNames().done(function (behaviors) {
            console.log(behaviors);
            callback(behaviors);
        });
    }).fail(function (error) {
        console.log("An error occurred: ", error);
        callback();  // Possibly callback with [] instead.
    });
}

使用延迟可能是一个更好的模式,但需要更多工作,我需要了解更多有关您正在呼叫的服务。

答案 1 :(得分:0)

你在getBehaviours() - &gt;上打电话获得行为

接下来你正在进行异步调用(它没有时间直接回答,但是稍后。

您将返回getBehaviorList而没有任何返回值(未定义),它没有长度。

之后您会收到来自getUserBehaviorNames和console.log(行为)的答案。

您需要从.done()

调用一个新函数
function continueBuildBehaviorList(behaviors) {
    $.each(behaviors, function (index, value) {
        if (value.indexOf("User/.lastUploadedChoregrapheBehavior") < 0) {
            $('#installedBehaviors tr:last').after('<tr><td>' + value.split('/').pop() + '</td><td><a href="#" class="btn btn-default" id="' + value + '"><span class="text-color-green glyphicon glyphicon-play-circle"></span> Start</a></td></tr>');
        }
    });
    $("#installedBehaviors a").click(function () {
        startBehavior(this);
    });
}