JavaScript - 使用 JavaScript 创建给 APP 外壳回调的临时函数 

Page / - 最后修改者 Qiongpan Ke 打开 2024-04-10 

使用 JavaScript 创建给 APP 外壳回调的临时函数 
最后修改者 Qiongpan Ke
打开 2024-04-10

内容列表

/**
 * 创建临时回调函数，主要用于提供给 APP 外壳，在需要时回调 WebView 中的 JavaScript 函数。
 *
 * @param name 临时回调函数的名称前缀。
 * @param callback 回调函数，入参可根据需要自由定义。
 * @param options 附加参数，在回调函数中可通过 this 访问这些附加参数。
 *                另外，预定义 timeoutInterval 参数用于设置临时回调函数的超时时间间隔，
 *                超时后会回调 timeoutCallback 参数指向的函数，默认超时时间为 5 分钟。
 * @return 返回临时回调函数的完整调用名称，可与入参拼装到一起，通过类似 eval 的方式进行调用。
 */
var createTemporaryCallback = function(name, callback, options) {
   const attribs = options || {};
   const funName = name + '_' + Date.now() + '_' + Math.floor(Math.random() * 1000000);
   const setupFn = function(obj) { window[funName] = obj; return 'window.' + funName; }
   const clearFn = function() { delete window[funName]; };
   const timerId = setTimeout(function() { clearFn(); attribs.timeoutCallback && attribs.timeoutCallback(); }, attribs.timeoutInterval || 5 * 60 * 1000);
   const funBody = function() { clearTimeout(timerId); clearFn(); delete attribs.timeoutCallback; callback.apply(this, arguments); };
   const tempObj = { name: funName, callback: funBody };
   Object.assign(funBody, callback);
   Object.assign(tempObj, attribs);
   return setupFn(tempObj) + '.callback';
};

var temporaryCallbackName = createTemporaryCallback('demoFn', function(success, message, data) {
   if (+success) {
       this.resolve(data);
    }
}, {
    resolve: function(data) {
        console.log('data=' + data);
    },
    timeoutInterval: 5000,
    timeoutCallback: function() {
        console.log('Timeout callback!!');
    }
});

var callbackStatement = temporaryCallbackName + "('1', '成功', 'Hello World!!');"
eval('setTimeout(function() { ' + callbackStatement + ' }, 4999);'); // 未超时，正常回调
eval('setTimeout(function() { ' + callbackStatement + ' }, 5000);'); // 已超时，回调失败