Project1

标题: mv的等待机制是咋实现的啊? [打印本页]

作者: 小怪兽奇奇侠    时间: 2020-8-22 22:43
标题: mv的等待机制是咋实现的啊?
今天我突发奇想,想用js做出mv的等待功能。
比如说等待1000ms再执行后边的代码,
但setTimeout只能执行指定函数,
在网上搜好像js是一下子执行到底的没法等待??
有大佬可以解释一下子么??
作者: zths    时间: 2020-8-22 23:42
js 一等待 整个脚本进程就死住了 啥都干不了

唯一类似的方法 用 async function
里面 用 Promise 写个 类似sleep的方法
https://blog.csdn.net/kingbaron/article/details/78508142
看看这个。
作者: zths    时间: 2020-8-22 23:47
兼容老MV的写法的话:
  1. function sleep(time) {
  2.     return new Promise(function(resolve){
  3.         setTimeout(resolve, time)
  4.     })
  5. }

  6. (async function() {
  7.     for (var i = 0;i < 10;i++) {
  8.         await sleep(1000)
  9.         console.log(i)
  10.     }
  11. })()
复制代码

作者: 喵呜喵5    时间: 2020-8-23 03:42
zths 发表于 2020-8-22 23:42
js 一等待 整个脚本进程就死住了 啥都干不了

唯一类似的方法 用 async function

不是,这不就是个普通的setTimeout吗咋就promise async await 这些优化回调地狱的手段都拉出来了

并且也不是唯一,还有已经没人用的generator 和 yield咧
作者: 喵呜喵5    时间: 2020-8-23 04:08
zths 发表于 2020-8-22 23:47
兼容老MV的写法的话:
  1. function sleep(time){
  2.   return new Promise(function(resolve){
  3.     setTimeout(resolve, time)
  4.   })
  5. }

  6. function foo(){
  7.   console.log(123)
  8.   sleep(1000)
  9.     .then(function(){
  10.       console.log(456)
  11.     })
  12.     .then(function(){
  13.       return sleep(500)
  14.     })
  15.     .then(function(){
  16.       console.log(789)
  17.     })
  18. }

  19. foo()
复制代码

作者: 喵呜喵5    时间: 2020-8-23 04:14
另外,MV的等待机制是靠一个计数器来实现的,类似这样:
  1. var wait = 1000
  2. function updateWait(){
  3.   if (wait > 0){ wait -= 1 }
  4. }
  5. function foo(){
  6.   console.log('时间到的时候执行的内容')
  7. }
  8. function update(){
  9.   updateWait()
  10.   if (wait > 0){ return }
  11.   foo()
  12. }
复制代码

update 是每帧都在调用的方法,调用的时候会检查计数器的值是否大于零,大于零则计数器-1,否则就跳过后续的处理,所以计数器是1000 = 等待1000帧,其他同理
作者: 喵呜喵5    时间: 2020-8-23 18:36
本帖最后由 喵呜喵5 于 2020-8-23 18:38 编辑
zths 发表于 2020-8-22 23:47
兼容老MV的写法的话:


“这么写 变量定义就得都写到sleep外面了。。。。”
啊?为啥?

  1. function sleep(time){
  2.   return new Promise(function(resolve){
  3.     setTimeout(resolve, time)
  4.   })
  5. }

  6. function foo(){
  7.   var bar = 12345
  8.   console.log(123)
  9.   sleep(1000)
  10.     .then(function(){
  11.       console.log(bar)
  12.       console.log(456)
  13.     })
  14.     .then(function(){
  15.       console.log(bar)
  16.       return sleep(500)
  17.     })
  18.     .then(function(){
  19.       console.log(bar)
  20.       console.log(789)
  21.     })
  22. }

  23. foo()
复制代码


“我写内方法也就是在异步方法里面有意义。。(好看和变量作用域)”
并不好看,除非你把 MV 整套重写成 async 的,否则就是个回调地狱

  1. function foo(){
  2.   (async function() {
  3.     await sleep(1000)
  4.     console.log(123)
  5.     (async function() {
  6.       await sleep(1000)
  7.       console.log(456)
  8.       (async function() {
  9.         await sleep(1000)
  10.         console.log(789)  
  11.       })()
  12.     })()
  13.   })()
  14. }
复制代码


如果这个你觉得好看的话,那这个更好看

  1. setTimeout(function(){
  2.   console.log(123)
  3.   setTimeout(function(){
  4.     console.log(456)
  5.     setTimeout(function(){
  6.       console.log(789)   
  7.     }, 1000)  
  8.   }, 1000)
  9. }, 1000)
复制代码


“还有针对两个但不跨整段的异常处理。。。这样也难写。。 搞成同步方法就没意义了。。”
大哥你这么用 aysnc  又不想要回调地狱,那异常处理就还是 promise 那套啊

  1. function foo(){
  2.   console.log(123)
  3.   sleep(1000)
  4.     .then(function(){
  5.       console.log(456)
  6.       throw 666
  7.     })
  8.     .catch(function(e){
  9.       console.error(`error:${e}`)
  10.     })
  11.     .then(function(){
  12.       return sleep(500)
  13.     })
  14.     .catch(function(e){
  15.       console.error(`error2:${e}`)
  16.     })
  17.     .then(function(){
  18.       console.log(789)
  19.     })
  20.     .catch(function(e){
  21.       console.error(`error3:${e}`)
  22.     })
  23. }
复制代码


作者: zths    时间: 2020-8-23 19:45
喵呜喵5 发表于 2020-8-23 18:36
“这么写 变量定义就得都写到sleep外面了。。。。”
啊?为啥?


try{
var变量1=1
可能出错的指令
异步等待
然后可能出错的指令
调用(变量1)
}catch(e){}
try{
别的指令
等待
可能出错的
}catch(e){}
问题 异步方法本身就是为了好看和好处理 你写成回调没意义了啊?
作者: 喵呜喵5    时间: 2020-8-23 21:18
本帖最后由 喵呜喵5 于 2020-8-23 21:22 编辑
zths 发表于 2020-8-23 19:45
try{
var变量1=1
可能出错的指令


可你的示意代码里并不是在 try catch ,而是包了个返回 promise 的匿名函数在同步方法里调用啊

另:直接上图反驳你说的异常 catch 直接到最后


作者: cool44    时间: 2020-8-26 14:42
怎么等?是等待指定的时间,然后执行代码吗?例如等待500帧然后执行代码:

var TimeVar = 500;
var TimeRate = TimeVar ;//初始化两个变量,意思是等待500帧

var _Time_update = Scene_Map.prototype.update;
Scene_Map.prototype.update = function() {

    $gameSystem._refresh_window_time = false;

      Time += 1;
       if (Time >= TimeVar)
    {
        TimeVar+= TimeRate ;
        //dosomething.......
}
      _Time_update.call(this);  
};

作者: applemmx    时间: 2021-4-23 10:26
喵呜喵5 发表于 2020-8-23 03:42
不是,这不就是个普通的setTimeout吗咋就promise async await 这些优化回调地狱的手段都拉出来了

并且也 ...

大佬,我想请教一下,使用完sleep() .then中怎样用一个this.xxx();函数 总不会要重新再写一遍吧...
作者: 喵呜喵5    时间: 2021-4-23 15:51
applemmx 发表于 2021-4-23 10:26
大佬,我想请教一下,使用完sleep() .then中怎样用一个this.xxx();函数 总不会要重新再写一遍吧... ...

js 的恶心 this

  1. var self = this
  2. sleep().then(function(){
  3.   self.xxx()
  4. })
复制代码

作者: applemmx    时间: 2021-4-23 23:48
喵呜喵5 发表于 2021-4-23 15:51
js 的恶心 this

大佬牛逼 受教了




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1