使用适当的回调作为javascript的延续

问题描述 投票:0回答:1

我熟悉回调,我知道同步是什么,但是在涉及持续传递样式时,我仍然缺少一些东西。我有一个简单的代码示例,其中我不知道如何基于连续传递样式的回调将其转换为异步代码:

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的所有方法都可以假定已被修改为接受回调作为继续。

我的问题是:两个代码段是否相等,并确认继续传递样式的第二个代码段?

非常感谢!

javascript asynchronous callback continuations
1个回答
0
投票

您的代码将与checkCountOnServerC的状态无关地并行执行checkPaymentCavailable。因此它们不是等效的。

正确的转换取决于您要采用的样式: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));
}
© www.soinside.com 2019 - 2024. All rights reserved.