#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 . Я не вижу, где я могу отметить этот ответ.
Я вызвал внутренние функции изнутри внешней функции, как он и предложил.