Files
cordova-shuto-api/www/ShutoApi.js
T
fandd 54e6a5785e feat(事件系统): 添加带回调的事件处理功能
实现原生与前端之间的双向事件通信机制,支持事件处理结果回调
添加 executeEvent 方法用于触发带回调的事件
完善 iOS 和 Android 平台的事件回调处理逻辑
更新文档说明带回调事件的使用方法
2026-01-19 09:33:49 +08:00

90 lines
2.9 KiB
JavaScript

var exec = require('cordova/exec');
var channel = require('cordova/channel');
// 初始化插件对象
var ShutoApi = {
close: function (success, error) {
exec(success, error, 'ShutoApi', 'close', []);
},
getUserInfo: function (success, error) {
exec(success, error, 'ShutoApi', 'getUserInfo', []);
},
// 执行带回调的事件
executeEvent: function (eventName, params, success, error) {
exec(success, error, 'ShutoApi', 'executeEvent', [eventName, params]);
}
};
// 创建事件发射器
var eventEmitter = {
listeners: {},
on: function (eventName, callback) {
if (!this.listeners[eventName]) {
this.listeners[eventName] = [];
}
this.listeners[eventName].push(callback);
},
off: function (eventName, callback) {
if (!this.listeners[eventName]) return;
this.listeners[eventName] = this.listeners[eventName].filter(cb => cb !== callback);
},
emit: function (eventName, data) {
if (!this.listeners[eventName]) return;
this.listeners[eventName].forEach(callback => {
try {
callback(data);
} catch (error) {
console.error('Error in event listener for ' + eventName + ': ' + error);
}
});
}
};
// 添加事件监听方法
ShutoApi.addEventListener = function (eventName, callback) {
eventEmitter.on(eventName, callback);
};
// 添加事件取消监听方法
ShutoApi.removeEventListener = function (eventName, callback) {
eventEmitter.off(eventName, callback);
};
// 内部事件处理函数,用于接收原生代码的事件通知
function onEvent(eventData) {
if (eventData && eventData.type) {
// 无回调的事件
eventEmitter.emit(eventData.type, eventData.params);
} else if (eventData && eventData.eventName && eventData.callbackId) {
// 带回调的事件
var eventName = eventData.eventName;
var params = eventData.params || {};
var callbackId = eventData.callbackId;
var listeners = eventEmitter.listeners[eventName] || [];
if (listeners.length > 0) {
var callback = function(result, error) {
exec(null, null, 'ShutoApi', 'eventCallback', [callbackId, result, error]);
};
listeners.forEach(function(listener) {
try {
listener(params, callback);
} catch (error) {
console.error('Error in event listener for ' + eventName + ': ' + error);
callback(null, error.message);
}
});
} else {
exec(null, null, 'ShutoApi', 'eventCallback', [callbackId, null, 'No listener for event: ' + eventName]);
}
}
}
// 初始化时注册事件通道
exec(onEvent, null, 'ShutoApi', 'registerEvent', []);
module.exports = ShutoApi;