JS-Promise(使异步操作同步执行)

Posted zjffun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS-Promise(使异步操作同步执行)相关的知识,希望对你有一定的参考价值。

Promise - JavaScript | MDN
Promise - 廖雪峰的官方网站

使用Promise使异步操作同步执行非常方便,我在遇到了使不确定个数个异步操作同步执行时学习了很久这个Promise的使用(当时因为没有理解透彻也纠结了好久),并进行总结,希望可以帮到大家

单个异步操作同步

<div id="box"></div>
<script>
  var box = document.querySelector(‘#box‘)
  var p = new Promise(function(resolve, reject){
    setTimeout(function(){
      box.innerhtml += ‘网络请求<br>‘;
      resolve()
    }, 1000)
  })
  p.then(function(resolve){
    box.innerHTML += ‘结束<br><hr>‘;
  })
</script>

确定个数异步操作同步

<div id="box"></div>
<script>
  var p = new Promise(function(resolve, reject){
    setTimeout(function(){
      box.innerHTML += ‘建立连接<br>‘;
      resolve(‘ok‘)
    }, 1000)
  })
  function post_sth(data){
    return new Promise(function(resolve, reject){
      setTimeout(function(){
        box.innerHTML += ‘post网络请求,此时data=‘+data+‘ <br>‘;
        resolve(data+‘|post‘)
      }, 1000)
    })
  }
  function get_sth(data){
    return new Promise(function(resolve, reject){
      setTimeout(function(){
        box.innerHTML += ‘get网络请求,此时data=‘+data+‘ <br>‘;
        resolve(data+‘|get‘)
      }, 1000)
    })
  }
  
  p.then(post_sth).then(get_sth).then(post_sth).then(function(data){
    box.innerHTML += ‘最后data=‘+data+‘<br><hr>‘;
  });
</script>

不定个数异步操作同步

<div id="box"></div>
<script>
  var p = new Promise(function(resolve, reject){resolve()})
  /**
    function
      返回function(供本then用)
        返回Promise(供下一个then用)
  */
  function get_request_sth_func(i){
    return function request_sth(){
      return new Promise(function(resolve, reject){
        setTimeout(function(){
          box.innerHTML += ‘请求‘+i+‘<br>‘;
          resolve()
        }, Math.round(Math.random()*1000))
      })
    }
  }
  for (var i = 0; i < 20; ++i) {
    p = p.then(get_request_sth_func(i))
  }
  p.then(function(){
    box.innerHTML += ‘完成<br><hr>‘;
  })
</script>

以上是关于JS-Promise(使异步操作同步执行)的主要内容,如果未能解决你的问题,请参考以下文章

js-promise以及asyncawait

第十次总结 线程的异步和同步

架构笔记[一]:同步与异步

使同步数据库操作异步

包装 node.js 同步函数是不是使其执行与其等效的异步相同?

JavaScript 异步操作之回调函数