我正在尝试通过zend_json_server提供我的用户存储库。问题是服务返回空对象。我错过了什么? 服务器端:
$repo = App_User_Repository::getInstance();
$server = new Zend_Json_Server();
$server->setClass($repo);
if ('GET' == $_SERVER['REQUEST_METHOD']) {
$server->setTarget('/service/json-rpc.php')
->setEnvelope(Zend_Json_Server_Smd::ENV_JSONRPC_2);
$smd = $server->getServiceMap();
// Set Dojo compatibility:
$smd->setDojoCompatible(true);
header('Content-Type: application/json');
echo $smd;
return;
}
$server->handle();
客户方:
var object = new dojo.rpc.JsonService('/service/json-rpc.php');
var deferred = object.getById(1);
deferred.addBoth(function(result) {console.log(result)});
Firebug控制台输出:
Object {}
这应该是一个用户对象
答案 0 :(得分:0)
使用“getById()”方法执行实际RPC时,将返回dojo.deferred对象。此时,正在运行异步请求。通过使用延迟对象,您可以提前定义回调和错误处理程序,同时等待返回响应。
检查实际响应对象是否也为空。请记住,您仍然必须在附加的类中使用return关键字将结果返回给Zend_Json_Server。然后,Zend_Json_Server将序列化并自动发回返回的值。来自Zend_Json_Server的响应始终是JSON中的序列化对象,包含一个id(随每个请求自动递增),一个字符串指示正在使用的jsonrpc版本(即2.0),当然还包含附加的返回数据的结果类。
setClass()方法不应该是对象实例,而是包含要附加的类的className的字符串。 Zend_Json_Server自己处理对象实例的创建,以及生成SMD(服务方法/映射器描述)。请记住使用docblocks记录每个公共方法,因为Zend_Json_Server使用这些docblock来确定SMD。
此外,使用类似流畅的接口和then()方法更为方便:
var myService = new dojo.rpc.JsonService('/service/json-rpc.php?');
var deferredObj = myService.doThis('myArgument');
deferredObj.then(callback, errorHandler).then(afterCallback).then(cleanUp);
在上面的例子中,变量callback,errorHandler,afterCallback和cleanUp实际上是对函数的引用。您调用的第一个then()方法会自动将rpc结果传递给回调函数。如果从附加的rpc类中抛出异常,则会调用errorHandler方法(第一个then()方法调用的第二个可选参数)。
更多信息:http://www.sitepen.com/blog/2010/05/03/robust-promises-with-dojo-deferred-1-5/
答案 1 :(得分:0)
我最近遇到了同样的问题,这不是dojo deferred的问题。我假设getById(1)
是您的远程函数调用,在这种情况下,如果您的服务器找到结果,则dojo不应该获取空对象。即使在延迟对象上使用addBoth
方法,仍会显示服务器的结果,这会让我相信您的问题不在您列出的任何代码中,但getById(1)
调用您的{ {1}}课程。在返回之前,您是否使用Zend_Dojo_Data或其他东西进行json编码?那会破坏你的结果,Zend_Json_Server会为你做编码。