`

[源代码]一个封装了系统服务的调用类ServiceRequestWrapper

阅读更多
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#系统封装并调用**"中,很可能包含了实际的C#代码示例,这些示例可能演示了如何创建自定义的类,封装了一些系统功能,并提供了调用这些封装功能的方法。通过下载并分析这些源码,你可以更深入...

    eclipse中android源代码-点击系统封装的方法可以看到源代码

    在探讨“Eclipse中Android源代码—点击系统封装的方法可以看到源代码”这一主题时,我们首先需要理解几个关键概念:Eclipse集成开发环境(IDE)、Android操作系统、源代码以及系统封装的方法。 ### Eclipse IDE ...

    html5页面开发源代码(含ajax封装及调用方法)

    提供完整的html5页面开发流程和开发方式,包括html5页面开发代码,含ajax封装方法,以及调用的方式

    sqlite3 dll源代码 静态库源代码 封装包源代码 vc6

    本资源提供的"sqlite3 dll源代码 静态库源代码 封装包源代码"是SQLite3数据库引擎的源码,适用于VC6开发环境,对于学习数据库系统内部工作原理以及C/C++编程者来说,这是一个非常宝贵的参考资料。 SQLite3的源代码...

    用友U9ERP 请购单 ISV 封装调用源代码

    用友U9ERP 请购单 ISV 封装调用源代码 C#版本,请购单创建,提交,审核

    图书管理系统jsp源代码

    总的来说,这个图书管理系统jsp源代码项目是一个实用的学习资源,有助于深入理解和实践Web应用开发,特别是JSP、Servlet和数据库管理方面的知识。通过对源代码的分析和调试,不仅可以巩固理论知识,还能提升实际编程...

    c# dll封装以及调用

    1. **WCF服务**:利用Windows Communication Foundation(WCF),可以创建一个服务,将DLL功能暴露为服务接口,实现跨进程甚至跨机器的调用。 2. **Remoting**:.NET Remoting是另一种跨进程通信方式,可以调用远程...

    源代码-AJAX类,调用方式类似jQuery.zip

    【标题】中的“源代码-AJAX类,调用方式类似jQuery”暗示了这是一个关于JavaScript编程的资源,特别是与AJAX(异步JavaScript和XML)技术相关,而且其设计风格和使用方法受到了jQuery库的启发。在AJAX的帮助下,...

    Unix操作系统Lions源代码

    Unix操作系统是计算机科学领域的一个里程碑,它以其简洁、高效和可移植性而著称。Lions源代码,全称为《UNIX Sixth Edition Source Code and Commentary》,是由John Lions编写的,是Unix早期版本——第六版的源代码...

    基于YOLOv5+Deepsort实现车辆行人追踪和计数项目源代码,代码封装成一个Detector类,更容易嵌入到自己的项目中

    基于YOLOv5+Deepsort实现车辆行人追踪和计数项目源代码,代码封装成一个Detector类,更容易嵌入到自己的项目中 DeepSort追踪器: deepsort = DeepSort(cfg.DEEPSORT.REID_CKPT, max_dist=cfg.DEEPSORT.MAX_DIST, ...

    一个封装了安全API调用机制的Delphi类..rar

    文件"codefans.net"可能是一个代码分享网站的链接,意味着这个Delphi类可能可以从那里获取。在实际应用中,这样的类库可以极大地提高Delphi开发者的生产力,同时增强软件的安全性和稳定性。对于深入学习和理解Delphi...

    JS的DLL封装及调用

    总结来说,"JS的DLL封装及调用"是一个高级的开发技巧,它结合了JavaScript的灵活性和.NET Framework的强大功能,旨在提高代码的安全性、重用性和性能。在实际应用中,应根据项目需求和团队技术栈来决定是否采用这种...

    java源代码 学生管理系统

    开发者通常会编写一个`DatabaseHelper`类,封装连接数据库、执行SQL和处理结果集的逻辑,以降低代码的耦合度。 此外,系统可能还涉及到异常处理和日志记录,以确保程序的健壮性。通过`try-catch-finally`语句块捕获...

    改U盘图片工具(c++,附源代码,已封装)

    标题"改U盘图片工具(c++,附源代码,已封装)"指的是一个使用C++编程语言开发的软件工具,它的主要功能是改变U盘的图标。在Windows操作系统中,通常可以通过修改文件的资源来实现这个功能。这个工具不仅提供了功能...

    实验五Linux系统调用的编程技术

    此外,实验还要求添加一个自定义的系统调用,这就涉及到对Linux内核源代码的阅读和修改。首先,需要获取最新的Linux内核源代码,然后在Ubuntu环境中编译内核。添加新系统调用的步骤包括在sys.c文件中添加函数声明,...

    C++源代码-高速公路收费系统

    源代码可能包含了类的设计,如`Vehicle`(车辆)、`TollBooth`(收费亭)、`Database`(数据库)等,这些类封装了各自的功能,实现了职责分离。 1. **车辆识别**:系统可能通过车牌识别技术来区分不同的车辆。这...

    用C#自己封装的JPush服务器端调用源代码

    标题中的“用C#自己封装的JPush服务器端调用源代码”指的是使用C#编程语言对极光推送(JPush)服务进行了封装,以便在服务器端方便地调用其API进行消息推送、用户管理等操作。JPush是极光公司提供的一款广泛应用于...

    在一个类中调用另一个类的数据成员的方法-程序实现

    本文将详细讲解如何在一个类中调用另一个类的数据成员,包括两种主要的方法:对象引用和友元函数。这两种方法都有其特定的应用场景和优缺点,开发者应根据实际需求选择合适的方式。 ### 1. 对象引用 对象引用是一...

    javaWEB酒店管理系统源代码(完整版)

    本项目是一个基于JavaWeb技术的酒店管理系统,适用于本科毕业设计,旨在提供一套完整的酒店业务流程解决方案。该系统利用Eclipse作为开发工具,结合MySQL数据库,实现了一套功能完善的酒店后台管理平台。下面将详细...

    实验(五)Linux系统调用的编程技术 - 副本.doc

    实验中,学生被要求实现`time`系统调用的两个不同版本:一个使用C语言库函数,另一个使用汇编代码直接调用。汇编版本可能会遇到错误,如时间转换问题或时钟同步问题。此外,实验还扩展到了实现`rename`系统调用,该...

Global site tag (gtag.js) - Google Analytics