Falcor的call
方法的任何地方都有很好的详细说明或用法示例吗?
我正在努力了解Falcor的call
方法。我了解第一个参数(functionPath
和args
),但是我对最后两个参数是什么以及如何使用(refSuffixes
和thisPaths
)一无所知。我不明白他们的描述。从Falcor's API reference:
/**
* 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
*/
我也没有找到一个很好的用法示例。我发现最好的是this falcor issue comment(下面的代码段),但是缺少一些变量定义-例如。
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
}
];
});
}
}
]);
在另一个client和server示例中,它显示了一种使用调用方法的方法:返回带有
{ paths: [...], jsonGraph: {...} }
的对象—返回pathValues或带有paths
和jsonGraph
的该对象有什么区别?我似乎在本地实现中缺少一些内容,并且我想这是因为我不了解falcor
call
方法的最后两个参数。 最佳答案
我想我了解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中。