Как вызвать конкретную вложенную функцию из нескольких

#javascript #function #nested-function

#javascript #функция #вложенная функция

Вопрос:

У меня есть вызываемая функция kasaScenes и конкретные вложенные функции «сцены», которые выполняют POST в зависимости от того, какую «сцену» мне нужно активировать. (например: sceneTooCold , sceneTooHot , и т.д.). Таким образом, позже в процессе температура датчика сравнивается с пороговым значением, и если она соответствует определенным критериям (например: если sensor.temperature <= 70, тогда активируйте функцию ‘sceneTooCold’ из kasaScenes. Как бы я выполнил эту работу из приведенного ниже фрагмента кода?

 function kasaScenes() {

  function sceneTooCold() {
    post_content_gAC = '{"method":"passthrough","params":{"deviceId":"'   gACID   '","requestData":"{\"system\":{\"set_relay_state\":{\"state\":'   stateOff   '}}}","token":"'   kasa_token   '"}}';
    post_content_gExhaust = '{"method":"passthrough","params":{"deviceId":"'   gExhaustID   '","requestData":"{\"system\":{\"set_relay_state\":{\"state\":'   stateOff   '}}}","token":"'   kasa_token   '"}}';
    post_content_gFans = '{"method":"passthrough","params":{"deviceId":"'   gFansID   '","requestData":"{\"system\":{\"set_relay_state\":{\"state\":'   stateOn   '}}}","token":"'   kasa_token   '"}}';
    post_content_gHeater = '{"method":"passthrough","params":{"deviceId":"'   gHeaterID   '","requestData":"{\"system\":{\"set_relay_state\":{\"state\":'   stateOn   '}}}","token":"'   kasa_token   '"}}';
    post_content_gCeiling = '{"method":"passthrough","params":{"deviceId":"'   gCeilingID   '","requestData":"{\"system\":{\"set_relay_state\":{\"state\":'   stateOn   '}}}","token":"'   kasa_token   '"}}';
    //<~POST Return~>
    returnValue_gAC = KumoApp.httpCallExternal(post_url, "POST", post_content_gAC);
    returnValue_gExhaust = KumoApp.httpCallExternal(post_url, "POST", post_content_gExhaust);
    returnValue_gFans = KumoApp.httpCallExternal(post_url, "POST", post_content_gFans);
    returnValue_gHeater = KumoApp.httpCallExternal(post_url, "POST", post_content_gHeater);
    returnValue_gCeiling = KumoApp.httpCallExternal(post_url, "POST", post_content_gCeiling);

  }

  function sceneTooHot() {
    post_content_gAC = '{"method":"passthrough","params":{"deviceId":"'   gACID   '","requestData":"{\"system\":{\"set_relay_state\":{\"state\":'   stateOn   '}}}","token":"'   kasa_token   '"}}';
    post_content_gExhaust = '{"method":"passthrough","params":{"deviceId":"'   gExhaustID   '","requestData":"{\"system\":{\"set_relay_state\":{\"state\":'   stateOn   '}}}","token":"'   kasa_token   '"}}';
    post_content_gFans = '{"method":"passthrough","params":{"deviceId":"'   gFansID   '","requestData":"{\"system\":{\"set_relay_state\":{\"state\":'   stateOn   '}}}","token":"'   kasa_token   '"}}';
    post_content_gHeater = '{"method":"passthrough","params":{"deviceId":"'   gHeaterID   '","requestData":"{\"system\":{\"set_relay_state\":{\"state\":'   stateOff   '}}}","token":"'   kasa_token   '"}}';
    post_content_gCeiling = '{"method":"passthrough","params":{"deviceId":"'   gCeilingID   '","requestData":"{\"system\":{\"set_relay_state\":{\"state\":'   stateOn   '}}}","token":"'   kasa_token   '"}}';
    //<~POST Return~>
    returnValue_gAC = KumoApp.httpCallExternal(post_url, "POST", post_content_gAC);
    returnValue_gExhaust = KumoApp.httpCallExternal(post_url, "POST", post_content_gExhaust);
    returnValue_gFans = KumoApp.httpCallExternal(post_url, "POST", post_content_gFans);
    returnValue_gHeater = KumoApp.httpCallExternal(post_url, "POST", post_content_gHeater);
    returnValue_gCeiling = KumoApp.httpCallExternal(post_url, "POST", post_content_gCeiling);

  }

  function sceneNormalTemp() {
    post_content_gCeiling = '{"method":"passthrough","params":{"deviceId":"'   gCeilingID   '","requestData":"{\"system\":{\"set_relay_state\":{\"state\":'   stateOff   '}}}","token":"'   kasa_token   '"}}';
    post_content_gExhaust = '{"method":"passthrough","params":{"deviceId":"'   gExhaustID   '","requestData":"{\"system\":{\"set_relay_state\":{\"state\":'   stateOff   '}}}","token":"'   kasa_token   '"}}';
    post_content_gFans = '{"method":"passthrough","params":{"deviceId":"'   gFansID   '","requestData":"{\"system\":{\"set_relay_state\":{\"state\":'   stateOn   '}}}","token":"'   kasa_token   '"}}';
    post_content_gHeater = '{"method":"passthrough","params":{"deviceId":"'   gHeaterID   '","requestData":"{\"system\":{\"set_relay_state\":{\"state\":'   stateOff   '}}}","token":"'   kasa_token   '"}}';
    //<~POST Return~>
    returnValue_gAC = KumoApp.httpCallExternal(post_url, "POST", post_content_gAC);
    returnValue_gExhaust = KumoApp.httpCallExternal(post_url, "POST", post_content_gExhaust);
    returnValue_gFans = KumoApp.httpCallExternal(post_url, "POST", post_content_gFans);
    returnValue_gHeater = KumoApp.httpCallExternal(post_url, "POST", post_content_gHeater);

  }

  function sceneTooWet() {
    post_content_gCeiling = '{"method":"passthrough","params":{"deviceId":"'   gCeilingID   '","requestData":"{\"system\":{\"set_relay_state\":{\"state\":'   stateOn   '}}}","token":"'   kasa_token   '"}}';
    post_content_gExhaust = '{"method":"passthrough","params":{"deviceId":"'   gExhaustID   '","requestData":"{\"system\":{\"set_relay_state\":{\"state\":'   stateOn   '}}}","token":"'   kasa_token   '"}}';
    post_content_gFans = '{"method":"passthrough","params":{"deviceId":"'   gFansID   '","requestData":"{\"system\":{\"set_relay_state\":{\"state\":'   stateOn   '}}}","token":"'   kasa_token   '"}}';
    post_content_gDehumidifier = '{"method":"passthrough","params":{"deviceId":"'   gDehumidifierID   '","requestData":"{\"system\":{\"set_relay_state\":{\"state\":'   stateOn   '}}}","token":"'   kasa_token   '"}}';
    post_content_gHumidifier = '{"method":"passthrough","params":{"deviceId":"'   gHumidifierID   '","requestData":"{\"system\":{\"set_relay_state\":{\"state\":'   stateOff   '}}}","token":"'   kasa_token   '"}}';
    //<~POST Return~>
    returnValue_gCeiling = KumoApp.httpCallExternal(post_url, "POST", post_content_gCeiling);
    returnValue_gExhaust = KumoApp.httpCallExternal(post_url, "POST", post_content_gExhaust);
    returnValue_gFans = KumoApp.httpCallExternal(post_url, "POST", post_content_gFans);
    returnValue_gDehumidifier = KumoApp.httpCallExternal(post_url, "POST", post_content_gDehumidifier);
    returnValue_gHumidifier = KumoApp.httpCallExternal(post_url, "POST", post_content_gHumidifier);

  }
}
 

Комментарии:

1. Вы ничего не возвращаете из родительской функции, так что прямо сейчас это просто невозможно. Либо преобразуйте родительскую функцию в объект с парами ключ / значение с ключами sceneTooCold, sceneTooHot и т. Д. И их значениями в качестве соответствующих функций, либо создайте kasaScenes вместо этого класс, а соответствующие функции — его методы.

2. Я не понимаю, в чем проблема. Что вам нужно, кроме if (sensor.temperature < 70) { sceneTooCol(); } else if (sensor.temperature > 100) { sceneTooHot(); } else { sceneNormalTemp(); }

3. @rahulpsd18 В этом есть смысл. Я все еще довольно новичок в js, поэтому не знал, что мне нужно что-то вернуть. На самом деле мне не нужны возвращаемые значения, а скорее только для этой конкретной части (то, что, по моему мнению, должно быть функцией) для запуска POST. Спасибо за руководство!

4. @Barmar Значит, размещение этого в другом месте за пределами внешней функции будет работать? Я пытался это сделать, но продолжал получать «TypeError: ‘sceneTooDry()’ не является функцией».

5. Нет, это должно быть внутри внешней функции.

Ответ №1:

Я получил ответ, используя предложение, сделанное @Barmar . Я не вижу, где я могу отметить этот ответ.

Я вызвал внутренние функции изнутри внешней функции, как он и предложил.