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

I need Falcor's `call` method explained; or a good example?

是否有 Falcor 的 call 方法的详细解释或用法示例?

我很难理解 Falcor 的 call 方法。我理解第一个参数(functionPathargs),但我对最后两个参数是什么以及它们的使用方式一无所知(refSuffixesthisPaths) .我不明白他们的描述。来自 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 或此对象中 pathsjsonGraph?

我的本地实现似乎遗漏了一些东西,我想这是因为我不理解 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 中。