Есть статьи wiki о них: (http://en.wikipedia.org/wiki/Futures_and_promises, http://en.wikipedia.org/wiki/Thunk_(delayed_computation)). Но я не уверен, каковы точные различия между ними как концепция языка программирования? Являются ли фьючерсы и promises применимыми только к параллельному программированию?
В чем разница между thunk, futures и promises?
Ответ 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 - это функция, которая устанавливает обратный вызов для получения значения.