ServiceRequestWrapper:
A simple class that provides common service Mojo.Service.Request lifetime management logic,
primarily this prevents garbage collection of request objects and their associated callbacks.
Install:
- Move service-request-wrapper.js into application source tree.
- Include service-request-wrapper.js via sources.json
Usage:
- Call ServiceRequestWrapper.request in place of all new Mojo.Service.Request calls.
Note that this wrapper will cleanup non-subscription requests. If a requests is made
as a subscription, the caller must explicitly call the cancel object for the given
request or the request object will remain in the heap until the application closes.
var ServiceRequestWrapper;
(function() {
var requestId = 0,
requests = [];
function completeHandler(optionsIn, requestId) {
return function(response) {
if (!(optionsIn.parameters && optionsIn.parameters.subscribe) && requests[requestId]) {
requests[requestId].cancel();
}
optionsIn.onComplete && optionsIn.onComplete(response);
};
}
function cancelHandler(requestId, original) {
return function() {
delete requests[requestId];
original.apply(this, arguments);
};
}
ServiceRequestWrapper = {
/**
* Initiates a request to the
*/
request: function(url, optionsIn, resubscribe) {
requestId++;
var options = this.bindOptions(url, optionsIn, requestId),
request = new Mojo.Service.Request(url, options, resubscribe);
request.cancel = cancelHandler(requestId, request.cancel);
requests[requestId] = request;
return request;
},
bindOptions: function(url, optionsIn, requestId) {
var options = Object.clone(optionsIn);
options.onComplete = completeHandler(optionsIn, requestId);
return options;
}
};
})();
测试类
function ServiceRequestWrapperTest() {}
ServiceRequestWrapperTest.prototype.exec = function(assistant, cont) {
execChain(assistant, cont, [
this.singleSuccessTest,
this.singleFailureTest,
this.subscriptionSuccessTest,
this.subscriptionFailureTest
], 0)();
};
ServiceRequestWrapperTest.prototype.singleSuccessTest = function(assistant, cont) {
var success,
request = ServiceRequestWrapper.request('palm://com.palm.preferences/systemProperties', {
method:"Get",
parameters:{"key": "com.palm.properties.nduid" },
onSuccess: function(response){
success = true;
},
onComplete: function(response) {
if (!success) {
assistant.failure("Did not recieve success event");
}
if (!request.cancelled) {
assistant.failure("Request not cancelled");
}
cont();
}
});
};
ServiceRequestWrapperTest.prototype.singleFailureTest = function(assistant, cont) {
var failure,
request = ServiceRequestWrapper.request(
"palm://com.palm.preferences/systemProperties", {
onFailure: function(response) {
failure = true;
},
onComplete: function(response) {
if (!failure) {
assistant.failure("Failure not recieved");
}
if (!request.cancelled) {
assistant.failure("Request not cancelled");
}
cont();
}
});
};
ServiceRequestWrapperTest.prototype.subscriptionSuccessTest = function(assistant, cont) {
var sub, secondSet;
function subComplete() {
if (sub.cancelled) {
assistant.failure("Request cancelled");
}
if (!secondSet) {
secondSet = true;
ServiceRequestWrapper.request('palm://com.palm.systemservice', {
method:"setPreferences",
parameters:{"food":"beef"},
onFailure: failure
});
} else {
sub.cancel();
if (!sub.cancelled) {
asssiant.failure("Requets not cancelled");
}
cont();
}
}
function failure() {
assistant.failure("Failure event");
cont();
}
ServiceRequestWrapper.request('palm://com.palm.systemservice', {
method:"setPreferences",
parameters:{"food":"pizza"},
onSuccess: function() {
sub = ServiceRequestWrapper.request('palm://com.palm.systemservice', {
method:"getPreferences",
parameters:{ keys: [ "food" ], subscribe: true },
onFailure: failure,
onComplete: subComplete
});
},
onFailure: failure
});
};
ServiceRequestWrapperTest.prototype.subscriptionFailureTest = function(assistant, cont) {
var failure,
request = ServiceRequestWrapper.request(
"palm://com.palm.preferences/systemProperties", {
subscribe: true,
onFailure: function(response) {
failure = true;
},
onComplete: function(response) {
if (!failure) {
assistant.failure("Failure not recieved");
}
if (!request.cancelled) {
assistant.failure("Request not cancelled");
}
cont();
}
});
};
分享到:
相关推荐
在提供的压缩包文件"**C#系统封装并调用**"中,很可能包含了实际的C#代码示例,这些示例可能演示了如何创建自定义的类,封装了一些系统功能,并提供了调用这些封装功能的方法。通过下载并分析这些源码,你可以更深入...
本资源提供的"sqlite3 dll源代码 静态库源代码 封装包源代码"是SQLite3数据库引擎的源码,适用于VC6开发环境,对于学习数据库系统内部工作原理以及C/C++编程者来说,这是一个非常宝贵的参考资料。 SQLite3的源代码...
用友U9ERP 请购单 ISV 封装调用源代码 C#版本,请购单创建,提交,审核
1. **WCF服务**:利用Windows Communication Foundation(WCF),可以创建一个服务,将DLL功能暴露为服务接口,实现跨进程甚至跨机器的调用。 2. **Remoting**:.NET Remoting是另一种跨进程通信方式,可以调用远程...
【系统托盘程序(封装为dll)】是一个用于创建驻留在Windows操作系统任务栏通知区域(通常称为系统托盘)的应用程序或服务的源代码项目。这个项目被封装在一个DLL(动态链接库)文件中,使得其他应用程序能够方便地...
总结来说,"JS的DLL封装及调用"是一个高级的开发技巧,它结合了JavaScript的灵活性和.NET Framework的强大功能,旨在提高代码的安全性、重用性和性能。在实际应用中,应根据项目需求和团队技术栈来决定是否采用这种...
对于服务器端,我们需要创建一个监听套接字,设置好端口号,并调用`bind()`函数绑定到指定的IP地址和端口。然后使用`listen()`函数设置最大连接队列长度,等待客户端的连接请求。当有客户端连接时,`accept()`函数会...
基于YOLOv5+Deepsort实现车辆行人追踪和计数项目源代码,代码封装成一个Detector类,更容易嵌入到自己的项目中 DeepSort追踪器: deepsort = DeepSort(cfg.DEEPSORT.REID_CKPT, max_dist=cfg.DEEPSORT.MAX_DIST, ...
6. **封装与抽象**:VB的类和对象可以用来封装开钱箱的具体实现细节,提供一个简洁的接口供外部调用,提高代码的复用性和可维护性。 7. **DLL动态链接库**:VB编译后的代码可能以DLL的形式存在,这样其他语言可以...
开发者通常会编写一个`DatabaseHelper`类,封装连接数据库、执行SQL和处理结果集的逻辑,以降低代码的耦合度。 此外,系统可能还涉及到异常处理和日志记录,以确保程序的健壮性。通过`try-catch-finally`语句块捕获...
标题"改U盘图片工具(c++,附源代码,已封装)"指的是一个使用C++编程语言开发的软件工具,它的主要功能是改变U盘的图标。在Windows操作系统中,通常可以通过修改文件的资源来实现这个功能。这个工具不仅提供了功能...
首先,`PhotoUtil`是一个实用工具类,它封装了Android系统相机和相册的调用逻辑,使得开发者能够更方便、快速地集成这些功能。通常,这样的工具类会包含一系列静态方法,每个方法对应一个特定的操作,如打开相机、...
此外,实验还要求添加一个自定义的系统调用,这就涉及到对Linux内核源代码的阅读和修改。首先,需要获取最新的Linux内核源代码,然后在Ubuntu环境中编译内核。添加新系统调用的步骤包括在sys.c文件中添加函数声明,...
源代码可能包含了类的设计,如`Vehicle`(车辆)、`TollBooth`(收费亭)、`Database`(数据库)等,这些类封装了各自的功能,实现了职责分离。 1. **车辆识别**:系统可能通过车牌识别技术来区分不同的车辆。这...
本项目是一个基于JavaWeb技术的酒店管理系统,适用于本科毕业设计,旨在提供一套完整的酒店业务流程解决方案。该系统利用Eclipse作为开发工具,结合MySQL数据库,实现了一套功能完善的酒店后台管理平台。下面将详细...
标题中的“用C#自己封装的JPush服务器端调用源代码”指的是使用C#编程语言对极光推送(JPush)服务进行了封装,以便在服务器端方便地调用其API进行消息推送、用户管理等操作。JPush是极光公司提供的一款广泛应用于...
本篇文章将深入探讨一个基于C++的餐厅管理系统,该系统包含了完整的源代码和数据库,旨在帮助学习者理解如何运用C++进行实际项目开发,特别是针对服务行业的管理系统。 首先,我们来看系统的模块构成。该餐厅管理...
本文将详细讲解如何在一个类中调用另一个类的数据成员,包括两种主要的方法:对象引用和友元函数。这两种方法都有其特定的应用场景和优缺点,开发者应根据实际需求选择合适的方式。 ### 1. 对象引用 对象引用是一...
* 4,GetAddressValueLength函数中 对使用说明的"第一步"分组 的元素个数进行指定。 * 5,在主程序中调用MBConfig进行协议初始化(初始化内容参考函数)。 * 6,在串口中断函数中调用MBDataReceive()。 * 7,定时器...
系统封装是软件开发中的一个重要概念,它涉及到将复杂的系统功能打包成易于理解和使用的模块。在这个"**C#系统封装并调用_函数_系统封装_源码.zip**"压缩包中,我们很可能会找到关于如何在C#中进行系统封装和函数...