我需要解释 Falcor 的 `call` 方法;或者一个很好的例子?
I need Falcor's `call` method explained; or a good example?
是否有 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 and server example, it shows one way to use the call method: returning an object with { paths: [...], jsonGraph: {...} }
— What is the difference between returning pathValues 或此对象中 paths
和 jsonGraph
?
我的本地实现似乎遗漏了一些东西,我想这是因为我不理解 falcor call
方法的最后两个参数。
我想我明白了 thisPaths
,但是我和你一样,我还不太明白 refPaths
。这是我对 thisPaths
.
的理解
如果调用路径是list.push
那么我们可以认为push
是方法,list
是对象。也就是说,当list.push()
被调用时,形象地说,push()
函数内部的this === list
。这需要一些想象力,因为就 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 中。
是否有 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 and server example, it shows one way to use the call method: returning an object with { paths: [...], jsonGraph: {...} }
— What is the difference between returning pathValues 或此对象中 paths
和 jsonGraph
?
我的本地实现似乎遗漏了一些东西,我想这是因为我不理解 falcor call
方法的最后两个参数。
我想我明白了 thisPaths
,但是我和你一样,我还不太明白 refPaths
。这是我对 thisPaths
.
如果调用路径是list.push
那么我们可以认为push
是方法,list
是对象。也就是说,当list.push()
被调用时,形象地说,push()
函数内部的this === list
。这需要一些想象力,因为就 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 中。