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
                        }
                    ];
                });
        }
    }
]);

在另一个clientserver示例中,它显示了一种使用调用方法的方法:返回带有{ paths: [...], jsonGraph: {...} }的对象—返回pathValues或带有pathsjsonGraph的该对象有什么区别?

我似乎在本地实现中缺少一些内容,并且我想这是因为我不了解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中。

10-06 12:36