【问题标题】:what is the difference between thunk, futures, and promises?thunk、futures 和 promises 之间有什么区别?
【发布时间】:2015-11-16 22:00:11
【问题描述】:

有关于它们的 wiki 文章:(http://en.wikipedia.org/wiki/Futures_and_promises, http://en.wikipedia.org/wiki/Thunk_(delayed_computation))。但是我不确定这三者作为编程语言概念之间的确切区别是什么? Future 和 Promise 是否只适用于并发编程?

【问题讨论】:

    标签: promise future delayed-execution thunk


    【解决方案1】:

    每个示例,使用 javascript,因为每个人都可以阅读。

    请不要在生产中使用此代码,使用真正的库,有很多好的。

    var a, b, c, async_obj;  // assume exist
    
    // CommonJS - for reference purposes
    
    try {
    
      async_obj.asyncMethod(a, b, c, function (error1, result1) {
    
        if (error1) {
          console.error(error1);
        } else {
          console.log(result1);
        }
    
      });
    
    } catch (ex1) {
      console.error(ex1);
    }
    
    // Thunk - "a parameterless closure created to prevent the evaluation of an expression until forced at a later time"
    
    function makeThunkForAsyncMethod (cb) {
      return function () {
        async_obj.asyncMethod(a, b, c, cb);
      }
    }
    
    var my_thunk = makeThunkForAsyncMethod(function (error1, result1) {
      if (error1) {
        console.error(error1);
      } else {
        console.log(result1);
      }
    });
    
    setTimeout(function () {
      try {
        my_thunk();
      } catch (ex1) {
        console.error(ex1);
      }
    }, 5e3);
    
    
    // Promise - "a writable, single assignment container which sets the value of the future"
    
    function makePromiseForAsyncMethod () {
      var
        future_then_cb,
        future_catch_cb,
        future
      ;
    
      future = {
        then: function (cb) {
          future_then_cb = cb;
        },
        catch: function (cb) {
          future_catch_cb = cb;
        };
      };
    
      try {
        async_obj.asyncMethod(a, b, c, function (error1, result1) {
          if (error1) {
            if (future_catch_cb) {
              future_catch_cb(error1)
            }
          } else {
            if (future_then_cb) {
              future_then_cb(result1);
            }
          }
        });
      } catch (ex1) {
        setTimeout(function () {
          if (future_catch_cb) {
            future_catch_cb(ex1);
          }
        });
      }
    
      return future;
    }
    
    // Future - "a read-only placeholder view of a variable"
    
    var my_future = makePromiseForAsyncMethod();
    
    my_future
      .then(function (result) {
        console.log(result);
      })
      .catch(function (error) {
        console.error(error);
      })
    ;
    

    Promise 链类似于上面人为设计的示例,但它适用于集合并且更加健壮。

    【讨论】:

    • 代码确实解释了很多,但如果你能添加更多解释,那就更好了。
    • 仍然无法获得虚构的差异,thunk 是一种惰性函数吗?
    • @zinking 基本上是的。我认为它是一个像中间件一样的包装函数。就像一个 python 装饰器,但只要你想。
    【解决方案2】:

    在函数式编程中,thunkpromise 最大的区别在于,thunk 是纯的,而promise 是不纯的。

    function thunkDemo() {
      return function(callback) {
        asyncMethod(someParameter, callback);
      };
    }
    
    function promiseDemo() {
      return new Promise(function(resolve, reject) {
         asyncMethod(someParameter, function(err, data) {
            if(err) return reject(err);
            resolve(data);
         });
      });
    }
    

    thunkDemo被调用时,直到内部方法被调用,asyncMethod才会被调用,所以thunkDemo是纯粹的,没有副作用。

    promiseDemo被调用时,它会立即调用asyncMethod,也就是说,它不是纯的。

    【讨论】:

      【解决方案3】:

      Thunk 是一个小函数的一般概念,它仅用于调整调用或以某种方式准备/修改它,然后重定向到正确的函数。诸如承诺、期货、闭包、包装器、存根或某些 OO 语言(如 C++)中虚函数表概念的实现之类的东西只是 thunk 的特殊用例(thunk 通常用于实现它们)。

      【讨论】:

        【解决方案4】:

        这些是相当广泛的术语,它们的用法和解释因上下文而异。所以只能针对特定的上下文给出具体的答案。

        例如,在 javascript promise 库中,术语“deferred”和“promise”分别用于链接的 wiki 文章所指的“promise”和“future”,因为“deferred”是解决问题的接口或拒绝该值,而“promise”是读取它的接口,其中包含更多细节,可以轻松为依赖值构造新的 Promise,但实际上不会更改原始 Promise。

        我刚刚偶然发现了 JS 库 "co" (https://github.com/visionmedia/co)。 这是我第一次听说“thunk”,它使用的术语似乎与 slf 的答案略有不同,而且比您链接的 wiki 更具体。它不是返回值的无参数函数,它是一个接受回调的函数,该函数将使用该值调用回调,通常是异步的。

        在这个特定库的例子中,thunk 和 promises 非常接近:promise 是一个对象,它有一个“then”方法函数,它设置一个回调来获取值; thunk 直接是一个设置回调以获取值的函数。

        【讨论】:

          猜你喜欢
          • 2016-10-21
          • 2018-10-21
          • 2016-08-03
          • 2020-04-17
          • 1970-01-01
          相关资源
          最近更新 更多