Подтвердить что ты не робот

В чем разница между thunk, futures и promises?

Есть статьи wiki о них: (http://en.wikipedia.org/wiki/Futures_and_promises, http://en.wikipedia.org/wiki/Thunk_(delayed_computation)). Но я не уверен, каковы точные различия между ними как концепция языка программирования? Являются ли фьючерсы и promises применимыми только к параллельному программированию?

4b9b3361

Ответ 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);
  })
;

Цепочка обещаний будет подобна приведенному выше надуманному примеру, но она будет работать над коллекциями и быть более надежной.

Ответ 2

в функциональном программировании наибольшая разница между 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, что означает, что он не является чистым.

Ответ 3

Thunk - это общая концепция небольшой функции, которая используется только для того, чтобы адаптировать вызов или подготовить/изменить его каким-то образом, а затем перенаправить на нужную функцию. Такие вещи, как promises, фьючерсы, замыкания, обертки, заглушки или реализации концепции виртуальных таблиц функций в некоторых языках OO (например, С++) - это просто специальные случаи использования thunks (для их реализации часто используются thunks).

Ответ 4

Это довольно широкие термины, и их использование и интерпретации варьируются в зависимости от контекста. Поэтому конкретный ответ может быть задан только для конкретного контекста.

В библиотеках обещаний javascript, например, термины "отложен" и "обещание" используются для того, что ваша связанная статья wiki называется "обещанием" и "будущим" соответственно, поскольку "отложенный" - это интерфейс для разрешения или отклонение значения, а "обещание" - это интерфейс для его чтения, с некоторыми особенностями, которые позволяют легко создавать новые promises для зависимых значений, но фактически не изменяют первоначальное обещание.

Я просто наткнулся на библиотеку JS "co" (https://github.com/visionmedia/co). Это был первый раз, когда я услышал о "thunks" и, похоже, использовал термин в немного отличном от ответа slf и гораздо более конкретный, чем ваш связанный wiki. Это не функция без параметров, которая возвращает значение, это функция, принимающая обратный вызов, который будет вызывать обратный вызов со значением, часто асинхронно.

В этом конкретном случае библиотеки thunks и promises очень близки друг к другу: обещание - это объект с функцией "then" method, которая устанавливает обратный вызов для получения значения; thunk - это функция, которая устанавливает обратный вызов для получения значения.