Qiongpan Ke 于 2024-07-03 最后修改

显示最后作者
1 {{code language="js"}}
2 /**
3 * 创建临时回调函数,主要用于提供给 APP 外壳,在需要时回调 WebView 中的 JavaScript 函数。
4 *
5 * @param name 临时回调函数的名称前缀。
6 * @param callback 回调函数,入参可根据需要自由定义。
7 * @param options 附加参数,在回调函数中可通过 this 访问这些附加参数。
8 * 另外,预定义 timeoutInterval 参数用于设置临时回调函数的超时时间间隔,
9 * 超时后会回调 timeoutCallback 参数指向的函数,默认超时时间为 5 分钟。
10 * @return 返回临时回调函数的完整调用名称,可与入参拼装到一起,通过类似 eval 的方式进行调用。
11 */
12 var createTemporaryCallback = function(name, callback, options) {
13 const attribs = options || {};
14 const funName = name + '_' + Date.now() + '_' + Math.floor(Math.random() * 1000000);
15 const setupFn = function(obj) { window[funName] = obj; return 'window.' + funName; }
16 const clearFn = function() { delete window[funName]; };
17 const timerId = setTimeout(function() { clearFn(); attribs.timeoutCallback && attribs.timeoutCallback(); }, attribs.timeoutInterval || 5 * 60 * 1000);
18 const funBody = function() { clearTimeout(timerId); clearFn(); delete attribs.timeoutCallback; callback.apply(this, arguments); };
19 const tempObj = { name: funName, callback: funBody };
20 Object.assign(funBody, callback);
21 Object.assign(tempObj, attribs);
22 return setupFn(tempObj) + '.callback';
23 };
24
25 var temporaryCallbackName = createTemporaryCallback('demoFn', function(success, message, data) {
26 if (+success) {
27 this.resolve(data);
28 }
29 }, {
30 resolve: function(data) {
31 console.log('data=' + data);
32 },
33 timeoutInterval: 5000,
34 timeoutCallback: function() {
35 console.log('Timeout callback!!');
36 }
37 });
38
39 var callbackStatement = temporaryCallbackName + "('1', '成功', 'Hello World!!');"
40 eval('setTimeout(function() { ' + callbackStatement + ' }, 4999);'); // 未超时,正常回调
41 eval('setTimeout(function() { ' + callbackStatement + ' }, 5000);'); // 已超时,回调失败
42 {{/code}}
版权所有,如发现盗用模仿必追诉法律责任!
CopyRight © 2020-2023 keqiongpan.cn. All Right Reserved.