代码之家  ›  专栏  ›  技术社区  ›  user1283776

切换case,如果case A或B,我想做一些事情,如果case A或B,我想做其他事情?

  •  -1
  • user1283776  · 技术社区  · 7 年前

    看看这个switch case语句。案例“回应”和“错误”有很多共同点,但也有一条线将它们区分开来。

                switch (data.type) {
                    case 'response':
                        const transactionId = data.trans_id;
                        const callbacks = commandCallbacks[transactionId];
    
                        if (!callbacks) {
                            if (logger) logger(`Dropping received message that was not requested, transactionId: ${transactionId}`);
                            break;
                        }
    
                        clearTimeout(callbacks.timedOutTimer);
                        callbacks.resolver(data);
                        break;
                    case 'error':                
                        const transactionId = data.trans_id;
                        const callbacks = commandCallbacks[transactionId];
    
                        if (!callbacks) {
                            if (logger) logger(`Dropping received message that was not requested, transactionId: ${transactionId}`);
                            break;
                        }
    
                        clearTimeout(callbacks.timedOutTimer);
                        callbacks.rejecter(data);
                        break;
                    case 'information':
                    case 'progress':
                    default:
                        break;
                }
    

    6 回复  |  直到 7 年前
        1
  •  1
  •   Buczkowski    7 年前
            switch (data.type) {
                case 'error':
                case 'response':
                    const transactionId = data.trans_id;
                    const callbacks = commandCallbacks[transactionId];
    
                    if (!callbacks) {
                        if (logger) logger(`Dropping received message that was not requested, transactionId: ${transactionId}`);
                        break;
                    }
    
                    clearTimeout(callbacks.timedOutTimer);
                     data.type === 'response' ? callbacks.resolver(data) : callbacks.rejecter(data);
                    break;
                case 'information':
                case 'progress':
                default:
                    break;
            }
    

    此外,如果您有更多的选项来签入交换机,您可以将其更改为 if .

        2
  •  1
  •   CertainPerformance    7 年前

    使用括号表示法和条件运算符访问 callbacks ,然后调用函数:

    switch (data.type) {
      case 'response':
      case 'error':
        const transactionId = data.trans_id;
        const callbacks = commandCallbacks[transactionId];
    
        if (!callbacks) {
          if (logger) logger(`Dropping received message that was not requested, transactionId: ${transactionId}`);
          break;
        }
    
        clearTimeout(callbacks.timedOutTimer);
        const fn = callbacks[data.type === 'response' ? 'resolver' : 'rejecter'];
        fn(data);
        break;
        // ...
    

    注意,如果函数依赖于 this 回调 ,使用 .call 取而代之的是:

    fn.call(callbacks, data);
    

    这实际上与OR和XOR没有任何关系-不同 case

        3
  •  1
  •   Nick Parsons Felix Kling    7 年前

    让 response error 通过移动你的 case

    switch (data.type) {
      case 'response':
      case 'error':
        const transactionId = data.trans_id;
        const callbacks = commandCallbacks[transactionId];
    
        if (!callbacks) {
          if (logger) logger(`Dropping received message that was not requested, transactionId: ${transactionId}`);
          break;
        }
    
        clearTimeout(callbacks.timedOutTimer);
        if(data.type === 'response') {
          callbacks.resolver(data);
        } else if(data.type === 'error' {
          callbacks.rejecter(data);
        }
        break;
    
      case 'information':
      case 'progress':
    }
        4
  •  1
  •   Nina Scholz    7 年前

    您可以使用一个函数来获取回调,然后使用具有正确目标值的对象调用它。

    function getCallbacks({ trans_id }) {
        const callbacks = commandCallbacks[trans_id];
        if (!callbacks) {
            if (logger) logger(`Dropping received message that was not requested, transactionId: ${transactionId}`);
            return;
        }
        return callbacks;
    }
    
    switch (data.type) {
        case 'response':
        case 'error':
            let cb = getCallbacks(data);
            if (!cb) break;
            clearTimeout(cb.timedOutTimer);
            cb[{ response: 'resolver', error: 'rejecter' }[data.type]](data);
    }
    
        5
  •  1
  •   einarmagnus    7 年前

    我会完全跳过switch语句,这样写:

    if (["reponse", "error"].includes(data.type)) {
        const transactionId = data.trans_id;
        const callbacks = commandCallbacks[transactionId];
        if (callbacks) {
            const callback = {
                response: data => callbacks.resolver(data),
                error: data => callbacks.rejecter(data)
            }[data.type];
            clearTimeout(callbacks.timedOutTimer);
            callback(data);
        } else if (logger) {
            logger(`Dropping received message that was not requested, transactionId: ${transactionId}`);
        }
    }
    

        6
  •  0
  •   user1283776    7 年前

    这是我最好的尝试:

                switch (data.type) {
                    case 'response':
                    case 'error':
                        const transactionId = data.trans_id;
                        const callbacks = commandCallbacks[transactionId];
    
                        if (!callbacks) {
                            if (logger) logger(`Dropping received message that was not requested, transactionId: ${transactionId}`);
                            break;
    
                        }
                        clearTimeout(callbacks.timedOutTimer);
    
                        switch (data.type) {
                            case 'response':
                                callbacks.resolver(data);
                            case 'error':
                                callbacks.rejecter(data);
                        }
    
                        break;
                    case 'information':
                    case 'progress':
                    default:
                        break;
                }