Meter 上传apk文件后,何时,如何调用服务器的解析方法 与结果处理

原文:http://blog.csdn.net/casun_li/article/details/46301027


我现在的前提条件是已经用CollectionFS上传apk文件成功,并且用aapt能解析apk文件的包包,版本等信息。

本文说的是,上传文件成功后何时调用解析方法,和解析后如何处理。


1,第一种方法,我采用的是;通过Meteor.call()调用服务器的解析方法。

 client:

 FileRe.insert(files[i], function (err, fileObj) {
    if (err) {
        alert('上传文件失败');
        return;
    }

    var url = FileRe.fileUrl(fileObj._id, fileObj.name());
    pushApk.addPushApk(fileObj.name(),'pkg', 'ver', url);

    callGetApkMsg(fileObj);//调用Meteor.call()

});

var callGetApkMsg=function(fileObj){

    var intervalHandle = Meteor.setInterval(function () {

        if (fileObj.hasStored("file_re")) {/等文件存储成功后再调用

            Meteor.call('getApkMsg',fileObj._id,fileObj.name(),function(error,msg){
                if(error){
                    console.log("getApkMsg "+ " error:"+error);
                    return;
                }
                console.log("getApkMsg "+ " msg:"+EJSON.stringify(msg));

            });

            console.log("file has stored, close out interval");
            // file has stored, close out interval
            Meteor.clearInterval(intervalHandle);
        }else{
            console.log("fileObj hasn't stored Inside interval---100--------");
        }
    }, 1000);

}

server:

Meteor.methods({
    getApkMsg:function(_id,name){

        var storepath= "~/meteor_uploads"+"/"+"file_records"+"-"+_id+"-"+name;

        console.log("Meteor.methods storePath   "+storepath);

        var appinfo=parseApkFile(storepath,function(msg){//parseApkFile解析方法

            pushApkRe.updatePushApkMsg(_id,msg['packageName'],msg['versionName'])//对结果的处理    

        });

        return appinfo;//appinfo is undefined . so don't use on client
    }
});

但是这出现一个异常:
Error: Meteor code must always run within a Fiber. Try wrapping callbacks that you pass to non-Meteor libraries with Meteor.bindEnvironment.
W20150601-11:07:42.565(8)? (STDERR)     at Object.Meteor._nodeCodeMustBeInFiber (packages/meteor/dynamics_nodejs.js:9:1)
W20150601-11:07:42.565(8)? (STDERR)     at Object.Meteor.bindEnvironment (packages/meteor/dynamics_nodejs.js:85:1)

原因是我对结果的处理的方法pushApkRe.updatePushApkMsg 中更新数据库时是异步的,所以报错,因此按提示
 Try wrapping callbacks,对回调加上Meteor.bindEnvironent(),大功ok.

Meteor.methods({
    getApkMsg:function(_id,name){

       

        var storepath= "~/meteor_uploads"+"/"+"file_records"+"-"+_id+"-"+name;

        console.log("Meteor.methods storePath   "+storepath);

        var appinfo=parseApkFile(storepath,
Meteor.bindEnvironment(
function(msg){//parseApkFile解析方法 pushApkRe.updatePushApkMsg(_id,msg['packageName'],msg['versionName'])//对结果的处理 })); return appinfo; }});



 
 参考资料:http://stackoverflow.com/questions/18346847/future-wait-cant-wait-without-a-fiber-while-waiting-on-another-future-in-met


2. 第二种方法,服务器数据库监听obeser来做.

   client:

FileRe.insert(files[i], function (err, fileObj) {
    if (err) {
        alert('上传文件失败');
        return;
    }
  
    var url = FileRe.fileUrl(fileObj._id, fileObj.name());
    pushApk.addPushApk(fileObj.name(),'', '', url);
//callGetApkMsg(fileObj);//不再调用call()});

server:

pushApk.find({pkg:''}).observe({//pushApkRecords {createdAt: {$gte:0}} new Date().getTime()-1000*60*60*24*30*12
    added:function(record){
        console.log(" id: "+record._id+"record.name: "+record.name);
        var f=FileRe.findOne({_id:_id);
        parseApkFileMsg(f._id, f.name());
    }
});

var parseApkFileMsg=function(_id,name){

    var storepath= "~/meteor_uploads"+"/"+"file_records"+"-"+_id+"-"+name;
    var fs =Npm.require('fs');

    console.log("parseApkFileMsg storePath   "+storepath);

    var intervalHandle = Meteor.setInterval(function () {

        console.log("parseApkFileMsg  Meteor.setInterval");

        fs.open("/meteor_uploads"+"/"+"file_records"+"-"+_id+"-"+name,'r',Meteor.bindEnvironment(function(err,fd){//fs.open()只能用绝对路径
            if (err && err.code=='ENOENT') {
                console.log("parseApkFileMsg hasn't exists Inside interval---1000--------count:"+count);
            }else{
                parseApkFile(storepath,Meteor.bindEnvironment(function(msg){
                    console.log("--------Meteor.methods msg   "+msg+ " packageName :"+ msg['packageName'] + " versionName:"+msg['versionName']);
                    var url = FileRecords.fileUrl(_id,name);                  
                    pushApkRe.updatePushApkMsg(_id,msg['packageName'],msg['versionName'])//对结果的处理 

                }));

                console.log("parseApkFileMsg file has stored, close out interval");
                // file has stored, close out interval
                Meteor.clearInterval(intervalHandle);
            }
        }));

        //fs.exists(storepath, function (exists) {//unbuntu上这方法没有 改用fs.open()
        //    if(exists){
        //        console.log("parseApkFileMsg file has stored, close out interval");
        //    }else{
        //       console.log("parseApkFileMsg hasn't exists Inside interval---1000--------");
        //    }
        //
        //});

    }, 1000);


}


原文:http://blog.csdn.net/casun_li/article/details/46301027


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ava实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),可运行高分资源 Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言中,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言中常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和模块化。C语言中定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言中用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言中定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言中用于存储同类型数据的结构,可以通过索引访问和修改数组中的元素。字符串是C语言中用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言中用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言中通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值