javascript - 理解延迟执行链的语法

标签 javascript node.js deferred

我开始学习 JavaScript - 真正学习 JavaScript。我来自 PHP 背景,所以一些 JavaScript 概念对我来说仍然是新概念,尤其是异步编程。这个问题之前可能已经回答过很多次了,但我一直没能找到答案。可能是因为除了举个例子之外,我什至不知道如何问这个问题。所以这里是:

使用 deferred package 时从 npm,我看到以下示例:

delayedAdd(2, 3)(function (result) {
  return result * result
})(function (result) {
  console.log(result); // 25 
});

他们将此称为链接,它实际上可以工作,因为我目前正在使用此代码来检查 promise 何时被解决或被拒绝。尽管他们称之为链接,但它让我想起了 Swift 中的尾随闭包。

我真的不明白这是什么类型的链接,因为我们有一个函数调用,然后紧接着是一个用括号括起来的匿名函数。

所以我想我有两个问题。

  1. 这是什么模式?
  2. 它是如何工作的?这可能是一个加载的问题,但我想知道某些东西是如何工作的,所以当有人问我这个问题时,我可以给他们一个详细的解释。

这里是delayedAdd函数:

var delayedAdd = delay(function (a, b) {
  return a + b;
}, 100);

它使用以下函数:

var delay = function (fn, timeout) {
  return function () {
    var def = deferred(), self = this, args = arguments;

    setTimeout(function () {
      var value;
      try {
        value = fn.apply(self, args));
      } catch (e) {
        def.reject(e);
        return;
      }
      def.resolve(value);
    }, timeout);

    return def.promise;
  };
};

最佳答案

其实很容易理解。让我们看看在计算表达式时这里发生了什么:

首先会调用 delayedAdd(2, 3) 函数。它做了一些事情然后返回。 “魔法”是关于它的返回值,即 function。更准确地说,它是一个至少需要一个参数的函数(我会回到那个)。

现在我们将 delayedAdd(2, 3) 评估为一个函数,我们进入代码的下一部分,即左括号。左括号和右括号当然是函数调用。因此,我们将调用 delayedAdd(2, 3) 刚刚返回的函数,并向其传递一个参数,这就是接下来要定义的:

该参数是另一个函数(如您在示例中所见)。这个函数也接受一个参数(计算结果)并返回它乘以自身。

第一次调用 delayedAdd(2, 3) 返回的函数返回另一个函数,我们将再次调用它,并使用 another 参数函数(链的下一部分)。

总而言之,我们通过将代码传递给 delayedAdd(2, 3) 返回的任何函数来构建函数链。这些函数将返回其他函数,我们可以再次传递我们的函数。

我希望这使它的工作方式有点清晰,如果不能随意询问更多。

关于javascript - 理解延迟执行链的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30596978/

相关文章:

javascript - 重定向 php 文件,无论 url 之后输入什么内容

javascript - 是什么阻止我的 JS 获取我的 URL 哈希?

javascript - HTML/JS - Bootstrap 日期选择器

javascript - Kendo MVC-如何在 MultiselectBox 上向数据源添加附加项目

javascript - 获得第一个单词在位置 0 和其他单词在位置 1 的数组作为输出的最佳方法?

angularjs - Angular $q,如何在 for 循环内和之后链接多个 Promise

node.js - 切换到输入nodejs的路径

node.js - 运行多个 nodejs 服务器实例以进行缩放

JavaScript 回调管理

android - 使用异步和等待从房间数据库获取数据