Мне нужен объясненный метод вызова Falcor; или хороший пример?
Есть ли хорошее подробное объяснение или пример использования в любом месте Falcor? call
метод?
Я изо всех сил пытаюсь понять Фалькора call
метод. Я понимаю первые аргументы (functionPath
а также args
), но я не знаю, что такое два последних аргумента и как они используются (refSuffixes
а также thisPaths
). Я не понимаю их описания. Из справки Фалькора по API:
/**
* Invokes a function in the DataSource's JSONGraph object.
* @name call
* @function
* @arg {Path} functionPath the path to the function to invoke
* @arg {Array.<Object>} args the arguments to pass to the function
* @arg {Array.<PathSet>} refSuffixes paths to retrieve from the targets of JSONGraph References in the function's response.
* @arg {Array.<PathSet>} thisPaths paths to retrieve from function's this object after successful function execution
* @returns {Observable.<JSONGraphEnvelope>} jsonGraphEnvelope the response returned from the server.
* @memberof DataSource.prototype
*/
Мне также не удалось найти хороший пример использования. Лучшее, что я нашел, это из этого комментария к проблеме ошибки (фрагмент ниже), но отсутствуют некоторые определения переменных, например. titleRef
:
var dataSource = new Router([
{
route: 'list.push',
call: function(callPath, args) {
// retrieving the title id from the reference path:
titleId = titleRef.value[1];
if (parseInt(titleId, 10).toString() !== titleId.toString())
throw new Error("invalid input");
return myListService.
addTitle(titleId).
then(function(length) {
return [
{
path: ['myList', length - 1],
value: titleRef
},
{
path: ['myList', 'length'],
value: length
}
];
});
}
}
]);
В другом примере клиента и сервера показан один из способов использования метода вызова: возвращение объекта с { paths: [...], jsonGraph: {...} }
- В чем разница между возвращением pathValues или этого объекта с paths
а также jsonGraph
?
Мне кажется, что-то не хватает в моих локальных реализациях, и я думаю, что это потому, что я не понимаю последние два аргумента к ошибкам call
метод.
1 ответ
Я думаю, что понял thisPaths
Однако я с тобой, я не совсем понимаю refPaths
еще. Вот мое понимание thisPaths
,
Если путь вызова list.push
тогда мы можем думать о push
как метод и list
как объект. Другими словами, когда list.push()
называется, образно говоря, this === list
внутри push()
функция. Это требует некоторого воображения, поскольку это не совсем так с точки зрения семантики времени выполнения JS. Скорее, Falcor поддерживает свободную аналогию с JavaScript, если это имеет смысл.
Итак, в коде на стороне клиента, если вы передаете thisPaths
как это:
model.call(
['list','push'], // call path
[...], // args
[...], // refPaths
[['length'],[0, 'foo']] // thisPaths
)
... это объединит this
возражать с теми thisPaths
и результирующие пути будут автоматически обновляться в кеше модели при получении ответа:
[['list', 'length'], ['list', 0, 'foo']]
Это хорошо, поскольку он дает клиенту некоторый контроль над тем, что обновляется в результате операции вызова, не прибегая к ручному аннулированию и повторному извлечению кэша, а также без того, чтобы разработчик обработчика маршрута вызова заранее предугадывал, чего хотят клиенты.
В частности, все это происходит без реализации call
функция обработчика, необходимая для чего-либо. (Это то, что поначалу заставило меня замолчать.) Это просто удобство, которое доступно вам на стороне клиента и автоматически встроено в Falcor.