Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 很难理解回调函数_Javascript_Jquery_Arrays_Function_Callback - Fatal编程技术网

Javascript 很难理解回调函数

Javascript 很难理解回调函数,javascript,jquery,arrays,function,callback,Javascript,Jquery,Arrays,Function,Callback,我是JavaScript新手,理解回调函数有困难 下面有一个函数返回一个数组,然后是另一个函数调用第一个函数。问题是,第二个函数中的数组始终未定义,即使第一个函数中的is返回一个对象数组 function getItems() { $.get(url, function(data) { var obj = $.parseJSON(data); var itemArr = $.map(o

我是JavaScript新手,理解回调函数有困难

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

    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);
    }
我知道第一个函数是异步的,因此在返回数组之前调用第二个函数中的警报,这会导致第二个函数向未定义的对象发出警报

我知道这方面有很多文档,但我很难理解它是如何工作的。有人能告诉我需要做哪些更改,以便alertTest函数在调用getItems函数后返回填充的数组吗

提前谢谢

$.get是一个异步函数。这意味着在命中时调用回调函数,并在内部返回响应

现在returnitemarr实际上由回调函数返回,并且 getItems实际上不返回任何内容,因此它总是未定义的

为了让代码正常工作

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

这将调用alertTest函数。

这样做的一种方法是使用JS承诺

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);
    });
}
这是一个很难让你的头左右。承诺允许您编写像同步代码一样按顺序运行的代码


您可以在函数中插入回调,并在get请求完成时进行调用,如Rhea的另一个回答所示,但这是一种更干净的方法,承诺现在是Javascript语言的一部分。

如果第一个函数也返回数组,那么第二个函数应该真正返回数组,如果需要使其正常工作,可以尝试使用alertgetItems更改函数alertTest中的行,其工作方式与您想象的相同。不需要返回Promise.resolve。只需返回$。get将做同样的事情。这将返回一个不同的I beleive,它不是承诺一个与承诺相同的合同。但是,没错,没问题。如果你认为这是最好的解决方案,你能按答案旁边的勾号将其标记为正确吗。
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();