2013-12-26 9 views
2

Я новичок в nodeJS, и сейчас я пишу небольшой сервис, который подключается к внешнему api. Этот api имеет несколько типов объектов, и для каждого объекта существует несколько типов функций. Я хочу, чтобы моя служба запрашивала этот api, но я хочу, чтобы запросы были определены каждый в своем собственном json-файле, поэтому для будущего использования люди могут добавлять/удалять/изменять эти запросы.динамические вызовы функций в nodejs

пример файла JSON:

{ 
    "object": "foo", 
    "function": "bar", 
    "params": { 
    "x": "1", 
    "y": "2" 
    } 
} 

объект «Foo», то есть «бар», и PARAMS будет принят в целом объект JSON, поэтому я не очень заботятся о эта часть.

Как я могу создать объект 'foo', а затем вызвать функцию 'bar'?

+0

- это функция 'bar', уже определенная в коде? – bevacqua

+0

'var foo = new foo(); foo ['bar']. call (foo, params) '? – WiredPrairie

+0

foo и bar уже определены в API. Мне просто нужно test.json рассказать мне, какой объект мне нужно создать, а затем функцию ведьмы для вызова (с заданными параметрами). – itaymendel

ответ

2

Если я понимаю вещи ... скажу, что вы загружаете значения запроса, подобные этому ... (предполагая, возможно, незначительные изменения, чтобы сделать эту работу, или используя другой метод для загрузки содержимого файла в виде строки, а затем проанализируйте это и т.д .....)

var fileJSON = require('./test.json'); 
var meta = JSON.parse(fileJSON); 

... то при условии, что «Foo» объект является поле от контекста текущего метода (т.е. это) ... (что не может быть даже правильно) вы «мог бы» сделать что-то такое, как это ...

this[meta.object][meta.function](meta.params); 

т. е. получить объект «foo» вне контекста, получить «functio п «функция от этого объекта, и мы называем его прохождение в Params как объект, как вы упомянули (нужно ли вам это, я не уверен)

Предупреждение: - Я не уверен, что если» foo ", являющееся полем текущего объекта (это), было бы правильным, но я уверен, что вы можете приспособиться к этому ... Вам просто нужно изменить на этот на то, что объект имеет объект« foo »в поле или что-то в этом роде, т. е. построить экземпляр «foo» ... не зная, как структурированы вещи, это лучший пример, который, я думаю, могу вам дать. - Я уверен, если nodejs (v8) подавится на .Object и .function ... Вы, возможно, придется идти, как это вместо

this[meta["object"]][meta["function"]](meta.params); 
  • Это проверялось, у меня нет времени чтобы проверить, но я надеюсь, что в самое короткое время у меня это может по крайней мере помочь вам. Если это не так, то неважно. Надеюсь, поможет!
+1

Почему бы просто не написать 'this [meta.object] [meta.function] (meta.params);'? 'meta.function' все равно будет вызываться в контексте' this [meta.object] '. –

+0

Почему бы и нет ... потому что я устал, когда писал! : o) – jwwishart

+0

Well '[...] call() затем гарантирует, что контекст по-прежнему« foo »внутри метода [...]', то немного вводит в заблуждение, в то время как это не так, похоже на это требуется в этом случае;) –

Смежные вопросы