30

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

4

4 回答 4

15

每个示例,使用 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 链就像上面人为设计的示例,但它适用于集合并且更健壮。

于 2014-01-03T19:49:56.883 回答
13

thunk在函数式编程中,和之间最大的区别promise是,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,也就是说,它不是纯的。

于 2015-11-16T14:00:11.060 回答
3

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

于 2014-03-21T01:11:33.753 回答
2

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

例如,在 javascript promise 库中,术语“deferred”和“promise”分别用于链接的 wiki 文章所指的“promise”和“future”,因为“deferred”是解决或拒绝value,而“promise”是读取它的接口,有一些更具体的细节可以轻松地为依赖值构建新的 Promise,但实际上并没有改变原来的 Promise。

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

在这个特定库的情况下,thunk 和 promise 彼此非常接近:promise 是一个具有“then”方法函数的对象,该函数设置回调以获取值;thunk 直接是一个设置回调以获取值的函数。

于 2014-04-09T10:14:47.107 回答