有关于它们的 wiki 文章:(http://en.wikipedia.org/wiki/Futures_and_promises,http://en.wikipedia.org/wiki/Thunk_(delayed_computation))。但是我不确定这三者作为编程语言概念之间的确切区别是什么?期货和承诺是否仅适用于并发编程?
4 回答
每个示例,使用 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
在函数式编程中,和之间最大的区别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,也就是说,它不是纯的。
Thunk 是一个小函数的一般概念,它仅用于调整调用或以某种方式准备/修改它,然后重定向到正确的函数。诸如承诺、期货、闭包、包装器、存根或某些 OO 语言(如 C++)中虚函数表概念的实现之类的东西只是 thunk 的特殊用例(thunk 通常用于实现它们)。
这些是相当广泛的术语,它们的用法和解释因上下文而异。因此,只能针对特定的上下文给出特定的答案。
例如,在 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 直接是一个设置回调以获取值的函数。