理解回调函数很难

时间:2017-04-28 22:32:08

标签: javascript jquery arrays function callback

我是JavaScript新手,我很难理解回调函数。

我在下面有一个函数返回一个数组,然后是另一个调用第一个函数的函数。问题是,第二个函数中的数组总是未定义的,即使在第一个函数中返回一个对象数组。

    function getItems() {
        $.get(url,
            function(data) {
                var obj = $.parseJSON(data);
                var itemArr = $.map(obj, function(ele) { return ele; })
                return itemArr;
            });
    }


    function alertTest() {
        var items = getItems();
        alert(items);
    }

我理解第一个函数是异步的,因此第二个函数中的警报在返回的数组之前被调用,这导致第二个函数警告未定义的对象。

我知道有很多相关的文档,但我很难理解它是如何工作的。有人可以告诉我需要进行的更改,以便在调用getItems函数后,alertTest函数返回填充的数组吗?

提前致谢!

3 个答案:

答案 0 :(得分:1)

$.getasync函数。这意味着在命中时会调用callback函数,并在内部返回响应。

现在return itemArr实际上是由回调函数返回的 <{1}}实际上并没有返回任何内容,因此它总是未定义的。

要使您的代码正常工作,

getItems()

这会调用 function getItems() { $.get(url, function(data) { var obj = $.parseJSON(data); var itemArr = $.map(obj, function(ele) { return ele; }) alertTest(itemArr); return itemArr; }); } 函数。

答案 1 :(得分:0)

这样做的一种方法是使用像这样的JS Promises

function getItems() {
    return Promise.resolve(
        $.get(url,
            function (data) {
                var obj = $.parseJSON(data);
                var itemArr = $.map(obj, function (ele) {
                    return ele;
                })
                return itemArr;
            }));
}

function alertTest() {
    var items = getItems().then(function (items) {
        alert(items);
    });
}

很难理解你的想法。 Promises允许您编写以同步代码的顺序运行的代码。

你可以在函数中插入回调函数,并在get请求完成时调用,如Rhea的其他答案所示,但这是一种更简洁的方法,Promises现在是Javascript语言的一部分。

答案 2 :(得分:0)

function getItems() {
    $.get(url, function(data) {
        var obj = $.parseJSON(data);
        var itemArr = $.map(obj, function(ele) { return ele; })
        alertTest(itemArr);
    });
}      

function alertTest(items) {
    alert(items);
}

getItems();