Creator 2.1.2 的 pbkiller 如何把异步变同步

目前的pbkiller是异步加载的,一定要把proto的加载放在pbkiller.preload(callback){}里面。对于一些复杂的proto,某些字段常常是null,所以我想把信息都打包成一个个对象,作为另一个js文件导入。但是我尝试了很多方法,都没有办法保证pbkiller.preload(callback){}的callback完全执行完毕。换言之,我只想要同步的解决方案……以下是我的尝试。

尝试1. 让主页menu.js继承proto.js。proto.js里在onLoad里异步加载。这样有时会加载失败。
// menu.js
cc.Class({
extends: require(“proto”),

properties: {

},

// LIFE-CYCLE CALLBACKS:

// onLoad() {




// },

start() {
  
     
    console.log(self);
    console.log(self.protos);
    console.log(self.protos.bail);;
},



// update (dt) {},

});

// proto.js

var pbkiller = require(“pbkiller”);

cc.Class({
extends: cc.Component,

properties: {

    protos: {
        default: null,
        type: Object,
        //     get () {
        //         return this._bar;
        //     },
        //     set (value) {
        //         this._bar = value;
        //     }
    },
},

// LIFE-CYCLE CALLBACKS:

onLoad() {
    var self = this;

    pbkiller.preload(function () {
        var pb = pbkiller.loadAll();
        self.protos = {};
        self.protos.bail = new pb.poster.Bail();
        self.protos.bail.Req = new pb.poster.Bail.REQ();
    });



},

start() {

},


// update (dt) {},

});

尝试2.

var self = require(“Proto”);
cc.Class({
extends: cc.Component,

properties: {

   
},

// LIFE-CYCLE CALLBACKS:

// onLoad() {




// },

start() {
     
    console.log(self);
    console.log(self.protos);
    console.log(self.protos.bail);;
},



// update (dt) {},

});

// Proto.js

var pbkiller = require(“pbkiller”);
var self = {};

pbkiller.preload(function () {
var pb = pbkiller.loadAll();
self.protos = {};
self.protos.bail = new pb.poster.Bail();
self.protos.bail.Req = new pb.poster.Bail.REQ();
});

module.exports = self;

这样浏览器是没问题了,但是编辑器会报错。

所以 pbkiller就没有一个同步的解决方案吗?????????

用typescript的async/await

唉 不会写typescript

import pbkiller = require(“pbkiller”);

const { ccclass, property } = cc._decorator;

@ccclass
export default class NewClass extends cc.Component {

onLoad() {
    await const pb = this.loadrPB();

    this.protos = {};
    this.protos.bail = new pb.poster.Bail();
    this.protos.bail.Req = new pb.poster.Bail.REQ();
}

async loadrPB() {
    return new Promise<any>((resolve) => {
        pbkiller.preload(() => {
            const pb = pbkiller.loadAll();
            resolve(pb);
        });
    });
}

}

ts大概就是这个意思,可能写的有问题,我不知道你那边pb是怎么加载的,反正把异步的通过async/await来同步获取就可以了。TS没有那么难,看两天呗。

其实我比较喜欢静态语言哈哈。

用protobuf的话可以试试我这种:https://github.com/xiaocongcc/GameFramework/blob/master/doc/网络模块.md