js 求个工厂函数:异步函数只能有一个在异步执行,异步操作完成前再次调用不执行异步操作. 我写了一个,但是只能有一个参数.

2019-05-28 16:25:57 +08:00
 TomVista
/**
 * @param {(callback:any)=>any} f 
 */
function unselfAsyncfunction(f) {
  let canInvoke = true;
  return (callback) => {
    if (canInvoke) {
      canInvoke = false;
      f(function(arg) {
        if (typeof callback ==='function') {
          callback(arg);
        }
        canInvoke = true;
      });
    }
  };
}
1143 次点击
所在节点    问与答
10 条回复
waiaan
2019-05-28 16:41:25 +08:00
没看懂问题。
TomVista
2019-05-28 16:45:13 +08:00
@waiaan 滚动到底部异步懒加载,在第一次懒加载完成前,用户重复滚动到底部不能请求第二次;

现在整个工厂函数 推广这个特性...
IsaacYoung
2019-05-28 17:03:23 +08:00
Chrisssss
2019-05-28 17:08:53 +08:00
你说的是这样的吗?
```javascript
function unselfAsyncfunction (fn) {
let canInvoke = true
return function () {
if (!canInvoke) {
canInvoke = true
fn(...arguments).finally(() => {
canInvoke = false
})
}
}
}
```
noe132
2019-05-28 17:11:29 +08:00
类似 throttle。简单实现如下。
johnnyNg
2019-05-28 17:12:13 +08:00
```javascript

const unselfAsyncfunction = async fn => {
let isDone = true

return async (...args) => {
if (!isDone) {
throw new Error('pre call is not down!')
}

isDone = false

const rsp = await fn(...args)

isDone = true

return rsp
}
}

```
johnnyNg
2019-05-28 17:15:25 +08:00
楼主用的 callback 风格的异步,建议封装成 Promise 形式的异步
johnnyNg
2019-05-28 17:19:32 +08:00
@johnnyNg 把我上面函数最外层的 async 去掉,写错了
![]( )
mooncakejs
2019-05-28 17:38:04 +08:00
@noe132 没有处理 catch,
TomVista
2019-05-28 19:07:00 +08:00
思路有了,我去试试.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/568445

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX