javascript - JS 回调函数可以返回值吗?

标签 javascript callback

我完全理解为什么如果回调函数内部的逻辑正在外部服务器上执行或获取某些内容,则回调函数无法返回值。

我不太明白的是,如果回调函数内的所有内容都是正常的同步代码,为什么回调函数不返回值:

var myFunc = function(input, callback){
  var sum = input + 10;
  callback(sum);
};

sum = myFunc(1000, function(input){
  console.log(input);
  return input + 9000;
});
即使 console.log 记录的值为 1010,

sum 仍返回 undefined。

回调永远不能返回任何内容,这是一条硬性规定吗?

其他语言中的所有回调也不会返回任何内容吗?

编辑

这是一个更复杂的示例 - 它也不会返回任何内容

discounts = [

  {
    sku: "126D",
    title: "Discount for using 126",
    discountCode: "LOVE126",
    discountAmount: -2500,
    check: function(orderFormContents, callback) {

      var discountsApplied = orderFormContents.discountsApplied;
      var sqft = orderFormContents.propertyInfo.sqft;

      for (var i = discountsApplied.length - 1; i >= 0; i--) {
        if (discountsApplied[i].discountCode === this.discountCode) {
          if (sqft < 1501) {
            return callback('', 'Coupon Added', this.discountAmount);
          } else {
            return callback('', 'Coupon Added', (this.discountAmount + -2500));
          };
        };
      };

    }
  },

  // additional discount objects in array


];

var checkDiscount = function(code, orderFormContents, allDiscounts) {
  for (var i = allDiscounts.length - 1; i >= 0; i--) {
    if (allDiscounts[i].discountCode === code) {
      allDiscounts[i].check(orderFormContents, function(error, message, amount) {
          var result = {
            "error": error,
            "message": message,
            "amount": amount
          };
          debugger
          return result;
      });
    };
  };
};

var orderFormContents = {
  propertyInfo: {
    sqft: 1000
  },
  discountsApplied: [
    {
      discountCode: "LOVE126"
    }
  ]
};

var discountCode = "LOVE126";

var result = checkDiscount(discountCode, orderFormContents, discounts);
debugger
console.log(result);

最佳答案

您缺少 myFunc 中的 return 语句。

var myFunc = function(input, callback){
  var sum = input + 10;
  return callback(sum);
};

sum = myFunc(1000, function(input){
  console.log(input);
  return input + 9000;
});

需要额外说明的是,此示例中的回调没有什么特别之处。如果您链接函数,则只需确保返回每个结果即可。我们可以将当前示例重写为:

function myInnerFunc(sum) {
  return sum + 9000;
}

function myFunc (input){
  var sum = input + 10;
  return myInnerFunc(sum);
}

var sum = myFunc(1000);

但是,JavaScript 中一流函数的本质允许我们传递函数。这在函数式编程中变得很有趣,其中一个函数现在可以传递给多个其他函数以获得不同的结果。

function add (a, b) {
  return a + b;
}

function multi (a, b) {
  return a * b;
}

var list = [1, 2, 3, 4, 5];

console.log(list.reduce(add)); // 15
console.log(list.reduce(multi)); // 120

异步操作会在稍后的时间触发它们的回调,因此它们不能用于立即返回值。最简单的例子是 setTimeout,它在 N 毫秒后调用回调。在此示例中,myFunc 将在 setTimeout 有机会触发其回调之前返回。相同的逻辑可以应用于 AJAX 回调。

function myFunc (value) {
  var val;
  window.setTimeout(function () {
    val = value;
  }, 1000)
  return val;
}

var test = myFunc(1000)

console.log(test); // undefined
<小时/>

回答第 2 部分:电动布加洛

您仍然缺少返回

这一行

var result = checkDiscount(discountCode, orderFormContents, discounts);

分配 checkDiscount 的结果,但该函数不返回任何内容。

var checkDiscount = function(code, orderFormContents, allDiscounts) {
  for (var i = allDiscounts.length - 1; i >= 0; i--) {
    if (allDiscounts[i].discountCode === code) {
      allDiscounts[i].check(orderFormContents, function(error, message, amount) {
        var result = {
          "error": error,
          "message": message,
          "amount": amount
        };
        return result;
      });
    }
  }
  // Never returned, default return value is undefined
};

您可以通过正确返回来解决此问题。

var checkDiscount = function(code, orderFormContents, allDiscounts) {
  for (var i = allDiscounts.length - 1; i >= 0; i--) {
    if (allDiscounts[i].discountCode === code) {
      return allDiscounts[i].check(orderFormContents, function(error, message, amount) {
        var result = {
          "error": error,
          "message": message,
          "amount": amount
        };
        return result;
      });
    }
  }
};

老实说,这段代码确实是循环的,很可能可以重构为更简洁的代码。

关于javascript - JS 回调函数可以返回值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30925139/

相关文章:

javascript - 使用 Jquery 进行表单验证

javascript - 检查用户是否在线

javascript - 使用 CSS 缩放时,jquery-ui slider 行为错误

php - 防止用户在 Javascript 中直接看到 PHP url

c# - STA 线程在 Winforms 中使用,但在作为控制台应用程序执行时不使用

javascript - 扩展库时附加 jQuery 回调函数

javascript - jQuery 地址在回调中不起作用

java - 方法中内部类的返回值

javascript - 在javascript中合并两个文本

swift - 多个回调而不是在 swift 中使用委托(delegate)