由用户 Qiongpan Ke 在 2024-04-10 保存的版本 1.1
显示最后作者
| author | version | line-number | content |
|---|---|---|---|
| 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 | 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() { callback.apply(this, arguments); clearTimeout(timerId); clearFn(); }; | ||
| 19 | const tempObj = { action: funBody }; | ||
| 20 | Object.assign(funBody, callback); | ||
| 21 | Object.assign(tempObj, attribs); | ||
| 22 | return setupFn(tempObj) + '.action'; | ||
| 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}} |
粤公网安备 44011802000481号 粤ICP备2020117634号