我熟悉回调,我知道同步是什么,但是在涉及持续传递样式时,我仍然缺少一些东西。我有一个简单的代码示例,其中我不知道如何基于连续传递样式的回调将其转换为异步代码:
function performOrder() {
var available, placedOrder;
available = checkCountOnServer(order.item, order.count);
if (!available) {
showNotAvailableMessage(order);
return;
}
placedOrder = checkPayment(order.item, order.count, order.paymentMethod);
if (askUserForConfirmationWithDialog(placedOrder)) {
return confirmOrder(placedOrder);
}
}
我的处理方法是:
function performOrder() {
checkCountOnServerC(order.item, order.count, showNotAvailableMessage(order));
return checkPaymentC(order.item, order.count, askUserConfirmationWithDialogC(placedOrder, confirmOrder(placedOrder));
}
附加C的所有方法都可以假定已被修改为接受回调作为继续。
我的问题是:两个代码段是否相等,并确认继续传递样式的第二个代码段?
非常感谢!
您的代码将与checkCountOnServerC
的状态无关地并行执行checkPaymentC
和available
。因此它们不是等效的。
正确的转换取决于您要采用的样式:node.js标准回调样式,Promises,successCallback / errorCallback等。假设您要使用node.js标准回调样式:
function performOrderC(callback){
checkCountOnServerC(order.item, order.count, function(err, available){
if (! available ) {
showNotAvailableMessage(order));
return callback(new Error('Not available'));
}
checkPaymentC(order.item, order.count, function(err, placedOrder){
askUserConfirmationWithDialogC(placedOrder, function(){
callback(null, confirmOrder(placedOrder)); // this is how you "return" results
});
});
});
}
Node.js标准回调样式使用回调的第一个参数在堆栈中传递错误。但是在node.js之前,异步功能尚未普遍采用它。
如果上面的内容看起来有点密集(有时称为回调地狱),您可以随时将其重构为不使用匿名函数:
function checkPaymentHandler (callback) {
return function (err, placedOrder){
askUserConfirmationWithDialogC(placedOrder, function(){
callback(null, confirmOrder(placedOrder)); // this is how you "return" results
});
});
}
function checkCountHandler (callback) {
return function (err, available) {
if (! available ) {
showNotAvailableMessage(order));
return callback(new Error('Not available'));
}
checkPaymentC(order.item, order.count, checkPaymentHandler(callback));
}
}
function performOrderC(callback){
checkCountOnServerC(order.item, order.count, checkCountHandler(callback));
}