我需要解释Falcor的`call`方法;还是一个很好的例子?

时间:2016-06-20 15:15:54

标签: falcor falcor-router

Falcor call方法的任何地方都有详细的详细说明或用法示例吗?

我很难理解Falcor的call方法。我理解第一个参数(functionPathargs),但我对最后两个参数是什么以及如何使用它们感到无能为力(refSuffixes和{{1} })。我不理解他们的描述。来自Falcor's API reference

thisPaths

我也无法找到一个好的用法示例。我发现的最好的是this falcor issue comment(下面的代码段),但是有一些变量定义缺失 - 例如。 /** * 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

在另一个clientserver示例中,它显示了一种使用调用方法的方法:返回一个带有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 } ]; }); } } ]); 的对象 - 返回{{3}之间的区别这个对象包含{ paths: [...], jsonGraph: {...} }paths

我似乎在我的本地实现中遗漏了一些内容并且我正在思考它,因为我不理解falcor jsonGraph方法的最后两个参数。

1 个答案:

答案 0 :(得分:2)

我想我理解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中。