【问题标题】:Having a difficult time understanding callback functions难以理解回调函数
【发布时间】:2017-04-28 22:32:07
【问题描述】:

我是 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 函数返回填充的数组吗?

提前致谢!

【问题讨论】:

  • 如果第一个函数也返回一个数组,那么第二个函数应该返回一个数组,如果你需要让它工作,你可以尝试用“alert(getItems) 更改函数 alertTest() 中的行())" 它将按照您想象的方式工作。

标签: javascript jquery arrays function callback


【解决方案1】:

$.get 是一个async 函数。这意味着callback 函数在被击中并在内部返回响应时被调用。

现在return itemArr实际上是由回调函数返回的,并且 getItems() 实际上并没有返回任何东西,因此它总是未定义的。

为了让您的代码正常工作,

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

这将调用alertTest 函数。

【讨论】:

    【解决方案2】:

    一种方法是像这样使用 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);
        });
    }
    

    很难理解。 Promise 允许您编写像同步代码一样按顺序运行的代码。

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

    【讨论】:

    • return Promise.resolve( 是不必要的。只需return $.get( 也会做同样的事情。
    • 这将返回一个延迟的我相信它不是 Promise a++
    • Promise 相同的合同。但是,真的。
    • 没问题。如果您认为这是最佳解决方案,您可以按答案旁边的勾号将其标记为正确吗?
    【解决方案3】:
    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();
    

    【讨论】:

      猜你喜欢
      • 2014-05-16
      • 1970-01-01
      • 2021-03-16
      • 2013-09-29
      • 2016-01-05
      • 1970-01-01
      • 1970-01-01
      • 2021-01-17
      • 2017-07-26
      相关资源
      最近更新 更多