"use strict";/** * * @author xgqfrms * @license MIT * @copyright xgqfrms * @created 2022-10-18 * @modified * * @description How to get the return value of the setTimeout inner function in js All In One * @description 在 js 中如何获取 setTimeout 内部函数的返回值 * @difficulty Hard * @time_complexity O(n) * @space_complexity O(n) * @augments * @example * @link https://www.cnblogs.com/xgqfrms/p/16806941.html * @link https://www.cnblogs.com/xgqfrms/p/13849482.html * @solutions * * @best_solutions * */const log = console.log;// 1. no need return value/*function debounce(func, delay) {let id;//...rest 保证在不使用 arguments 的情况下,也可以传入不定数量的参数return function (...args) {let that = this;clearTimeout(id);id = setTimeout(() => {//apply 接受参数数组 [arg1, arg2, ...]func.apply(that, args);// func.apply(context, [...args]);//call 接受参数列表 (arg1, arg2, ...)// func.call(context, ...args2);}, delay);};};function test (a, b, c, d) {const args = [...arguments];console.log(`test args =`, args);}const fn = debounce(test, 1000);fn(1,2,3);fn(1,2,3,4);fn(1,2,3,4,5);*/// 2. setTimeout with return valueconst debounce = (func, delay) => {let id;//...rest 保证在不使用 arguments 的情况下,也可以传入不定数量的参数return async (...args) => {console.log(`\nrest args =`, args);console.log(`rest ...args =`, ...args);console.log(`rest [...args] =`, [...args]);let that = this;clearTimeout(id);const result = await new Promise((resolve, reject) => {id = setTimeout(() => {//apply 接受参数数组 [arg1, arg2, ...]resolve(func.apply(that, args));}, delay);});return result;// const promise = new Promise((resolve, reject) => {//id = setTimeout(() => {////apply 接受参数数组 [arg1, arg2, ...]//resolve(func.apply(that, args));//}, delay);// });// const result = await(promise);// console.log(`result =`, result);// return result;};};// 测试用例 test casesconst testCases = [{input: [1,2,3],result: '1,2,3',desc: 'value equal to "1,2,3"',},{input: [1,2,3,4],result: '1,2,3,4',desc: 'value equal to "1,2,3,4"',},{input: [1,2,3,4,5],result: '1,2,3,4,5',desc: 'value equal to "1,2,3,4,5"',},];function test (a, b, c, d) {const args = [...arguments];console.log(`test args =`, args);return args;}const func = debounce(test, 1000);log(`func =`, func);// func = [AsyncFunction (anonymous)](async () => {for (const [i, testCase] of testCases.entries()) {async function testCaseAsyncFunc(i, testCase) {const result = await func(...testCase.input);log(`result =`, result);log(`test case ${i} result: `, result.join() === testCase.result ? ` passed` : ` failed`, result);// log(`test case ${i} =`, testCase);}await testCaseAsyncFunc(i, testCase);}})();
js debounce & js throttle
如何使用 js 实现一个 debounce 函数 All In One【How to get the return value of the setTimeout inner function in js All In One】https://www.cnblogs.com/xgqfrms/p/13849482.html
如何使用 js 实现一个 throttle 函数 All In Onehttps://www.cnblogs.com/xgqfrms/p/13849487.html
refshttps://splunktool.com/how-to-make-javascript-settimeout-returns-value-in-a-function
https://stackoverflow.com/questions/24928846/get-return-value-from-settimeout
xgqfrms 2012-2020
www.cnblogs.com/xgqfrms 发布文章使用:只允许注册用户才可以访问!
原创文章,版权所有?xgqfrms, 禁止转载 ?,侵权必究?!
推荐阅读
- prometheus监控实战
- 分布式存储系统之Ceph集群启用Dashboard及使用Prometheus监控Ceph
- 使用docker-compose安装Prometheus
- vulnhub靶场之THE PLANETS: EARTH
- 植村秀口红最火的色号排行榜 便宜又好看,快来get同款吧
- vue2双向绑定原理:深入响应式原理defineProperty、watcher、get、set
- InetAddress.getLocalHost 执行很慢?
- winget 使用 Windows 包管理器 安装 .Net
- 了解Pytorch|Get Started with PyTorch
- Do your best, do the best . 翻译成中文是什么意思?