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();
}
});
};
分享到:
相关推荐
提供完整的html5页面开发流程和开发方式,包括html5页面开发代码,含ajax封装方法,以及调用的方式
本资源提供的"sqlite3 dll源代码 静态库源代码 封装包源代码"是SQLite3数据库引擎的源码,适用于VC6开发环境,对于学习数据库系统内部工作原理以及C/C++编程者来说,这是一个非常宝贵的参考资料。 SQLite3的源代码...
用友U9ERP 请购单 ISV 封装调用源代码 C#版本,请购单创建,提交,审核
1. **WCF服务**:利用Windows Communication Foundation(WCF),可以创建一个服务,将DLL功能暴露为服务接口,实现跨进程甚至跨机器的调用。 2. **Remoting**:.NET Remoting是另一种跨进程通信方式,可以调用远程...
【系统托盘程序(封装为dll)】是一个用于创建驻留在Windows操作系统任务栏通知区域(通常称为系统托盘)的应用程序或服务的源代码项目。这个项目被封装在一个DLL(动态链接库)文件中,使得其他应用程序能够方便地...
【标题】中的“源代码-AJAX类,调用方式类似jQuery”暗示了这是一个关于JavaScript编程的资源,特别是与AJAX(异步JavaScript和XML)技术相关,而且其设计风格和使用方法受到了jQuery库的启发。在AJAX的帮助下,...
基于YOLOv5+Deepsort实现车辆行人追踪和计数项目源代码,代码封装成一个Detector类,更容易嵌入到自己的项目中 DeepSort追踪器: deepsort = DeepSort(cfg.DEEPSORT.REID_CKPT, max_dist=cfg.DEEPSORT.MAX_DIST, ...
文件"codefans.net"可能是一个代码分享网站的链接,意味着这个Delphi类可能可以从那里获取。在实际应用中,这样的类库可以极大地提高Delphi开发者的生产力,同时增强软件的安全性和稳定性。对于深入学习和理解Delphi...
总结来说,"JS的DLL封装及调用"是一个高级的开发技巧,它结合了JavaScript的灵活性和.NET Framework的强大功能,旨在提高代码的安全性、重用性和性能。在实际应用中,应根据项目需求和团队技术栈来决定是否采用这种...
6. **封装与抽象**:VB的类和对象可以用来封装开钱箱的具体实现细节,提供一个简洁的接口供外部调用,提高代码的复用性和可维护性。 7. **DLL动态链接库**:VB编译后的代码可能以DLL的形式存在,这样其他语言可以...
开发者通常会编写一个`DatabaseHelper`类,封装连接数据库、执行SQL和处理结果集的逻辑,以降低代码的耦合度。 此外,系统可能还涉及到异常处理和日志记录,以确保程序的健壮性。通过`try-catch-finally`语句块捕获...
MFC将Windows操作系统的主要功能封装为一系列的C++类,如CWinApp、CFrameWnd、CDialog等,使得开发者可以更专注于业务逻辑,而不是底层的系统调用。在仓库管理系统中,`CWinApp`类通常作为应用程序的入口点,负责...
标题"改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. 对象引用 对象引用是一...