为什么没有解析就不会执行带有延迟的javascript承诺链接?

雅各布金

我想让异步函数像在 1 秒后执行 promise1,然后在 0.5 秒后传递 promise1,然后执行 promise2。我试过这个,但它不起作用。但该功能在放入resolve(). 我知道这是如何工作的,但我仍然不确定它为什么有效。

const button = document.getElementById('button');

        function painting() {
        return new Promise ((res) => {
          setTimeout(() => {
          button.style.backgroundColor = 'green';
          res();
              }, 1000);
        })
        .then(() => turnOff());
        }
            
        function turnOff() { 
        return new Promise(() => {
            setTimeout(() => {
            button.style.backgroundColor = 'red'
            }, 500)
        })
        }
        
        async function startPaint() {
              return await painting()
            }
            
button.onclick = function() {startPaint()};
<button id='button' >
hello
</button>

下面的代码是不起作用的:

const button = document.getElementById('button');

        function painting() {
        return new Promise ((res) => {
          setTimeout(() => {
          button.style.backgroundColor = 'green';          
          //res();
          //Chaining doesn't happen without res();
              }, 1000);
        })
        .then(() => turnOff());
        }
            
        function turnOff() { 
        return new Promise(() => {
            setTimeout(() => {
            button.style.backgroundColor = 'red'
            }, 500)
        })
        }
        
        async function startPaint() {
              return await painting();
            }
            
button.onclick = function() {startPaint()};
<button id='button' >
hello
</button>

jfriend00

你创建了一个新的承诺,但你永远不会解决它。您需要res()setTimeout(). 您手动创建的新承诺永远不会解析,直到您从承诺构造函数内部的某处调用解析函数。这就是 promise 构造函数的工作原理。

new Promise((resolve, reject) => {
     // you must call resolve(someVal) or reject(someErr) inside this function
     // somewhere or the promise will never resolve or reject
     
     // for example
     setTimeout(() => {
          resolve("hello");
     }, 1000);

     // nothing happens automatically when this function finishes execution
      
}).then(val => {
     console.log(val);
}).catch(err => {
     console.log(err);
});

而且,如果您的承诺从未被解决或拒绝,则永远不会调用.then().catch()处理程序。承诺将永远处于“待定”状态。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么没有特定的宽度和高度就不会显示背景图像?

为什么我的组件没有刷新页面就不会更新?

为什么没有父路径渲染就不会渲染子路径?

Kotlin和JPA / Hibernate:没有`open`就不会延迟加载吗?

为什么在使用断点时脚本会继续运行并且可以正常工作但没有断点就不会?

没有 subscribe() 就不会触发选择器

没有www就不会出现Webfont

为什么没有解决“承诺{<pending>}”?

为什么不调用JavaScript代码就不会显示Bootstrap模态

jQuery如果没有类就不会触发函数

Android:MediaPlayer已完成定稿,但没有启动新活动后就不会发布

没有页面刷新就不会显示PHP GET参数

没有先考虑因素就不会打印Python Sympy Latex Fraction

缩放后,没有不相关的图像就不会显示图像

没有chrome开发工具就不会显示ace编辑器

JS为什么承诺先打印所有解析,然后拒绝

构建没有解析器或拒绝的承诺

为什么这个承诺没有解决回给呼叫者?

SwiftyJSON不会解析JSON字符串,以后再解析就不会有问题

为什么 lxml html 解析器没有解析完整的文件?

为什么这段代码没有空格就不能解析?

当单元测试有解析错误时,为什么我的业力测试不会失败?

没有解析符号链接的规范路径

程序立即以退出代码0结束-但是如果没有输入,它就不会到达那里

使用discord.py重写创建即时邀请,似乎没有错误就不会这样做

为什么在没有执行带有“if”的 Promise 之后被阻塞?

异步 javascript,承诺链接 - 解析后不会执行函数

为什么 JsonConvert.Deserialize() 没有解析到它被序列化的对象?

为什么在 NuxtJS 中作为 prop 传递时,require() 没有解析图像路径?