想请教一下关于获取计时器内部数据的问题

2021-08-01 17:44:06 +08:00
 aglsv
function a (){
 let a = 0
 a = 1
 let loader = setInterval(function () {
            abc () 
            clearInterval(loader)
        }, 1000)
        
 function abc (){
 	a +=1
 }
 
 return a
}

我的预想是 return 的 a 为 2,但是现在 return 的结果依旧是 1,请问这个该怎么解决啊

1530 次点击
所在节点    JavaScript
9 条回复
lianyue
2021-08-01 19:00:30 +08:00
返回的时候 setInterval 里面的函数并没被执行
aglsv
2021-08-01 19:06:34 +08:00
@lianyue 那这个该怎么解决
lianyue
2021-08-01 19:20:03 +08:00
async
await
promise

自己了解
lianyue
2021-08-01 19:20:10 +08:00
rabbbit
2021-08-01 19:24:08 +08:00
const foo = () => {
  let bar = 1
  return new Promise(resolve => {
   setTimeout(() => resolve(++bar), 3000)
 })
}

(async() => console.log(await foo()))()
aglsv
2021-08-02 13:55:15 +08:00
@rabbbit 如果没法子使用 async 的话请问这个应该如何解决
aglsv
2021-08-02 13:55:37 +08:00
@lianyue 主要是没法子使用 async
rabbbit
2021-08-02 15:00:35 +08:00
const foo = () => {
let bar = 1;
return new Promise((resolve) => {
  setTimeout(() => resolve(++bar), 3000);
});
};

(() => {
  foo().then((bar) => {
   console.log(bar)
 })
})();


const foo = (callback) => {
let bar = 1;
setTimeout(() => {
  bar++;
  callback?.(bar)
}, 3000);
};

(() => {
  foo((bar) => console.log(bar))
})();
aglsv
2021-08-03 15:24:33 +08:00
@rabbbit 我想问一下第一种,比如 a 有一个```b+=bar```,然后把 b 给 return 出去,这时候因为 foo 里有个异步操作使用了 promise,这样的话就需要在 a 方法里面执行.then 来获取 bar,这样的话会是先```return b```,然后才执行```b+=bar```。
因为这个 b 要被上层方法使用,不能再把 a 方法也写成 promise,这样的话有办法解决吗

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

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

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

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

© 2021 V2EX