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>

原文地址:https://www.cnblogs.com/jffun-blog/p/9128196.html

时间: 2024-10-12 23:15:32

JS-Promise(使异步操作同步执行)的相关文章

js使用generator函数同步执行ajax任务

function request(url, callback) {   fetch(url, {mode: 'cors', credentials: 'include', headers: new Headers({ 'X-Requested-With': 'XMLHttpRequest' })})   .then(response => response.text())   .then(text => {     console.log(url);     console.log(text)

学JS的心路历程 -非同步执行

JS是单线程的语言,也就是说同一时间只会执行一行程序,所以如果一段程序执行过久就会造成阻塞(blocking)的现象,必须等到它结束后才能执行下一段程序. 举个例子来说,如果我们今天要买便当,但是老板说要十分钟才会好,那难道我们这十分钟内都不能做任何事情吗? 当然不是,JS本身有非同步执行的功能,也是就说我们会先跟这个函式说,你先到旁边继续跑,好了在「回来呼叫」我,我先继续跑其他程序. 有没有看到熟悉的关键字「回来呼叫」,没错非同步执行基本上都是利用callback达成. 举个例子来说,我们今天

JS Promise API

一.描述 我们知道JavaScript语言的执行环境是"单线程",所谓单线程,就是一次只能够执行一个任务,如果有多个任务的话就要排队,前面一个任务完成后才可以继续下一个任务. 这种"单线程"的好处就是实现起来比较简单,容易操作:坏处就是容易造成阻塞,因为队列中如果有一个任务耗时比较长,那么后面的任务都无法快速执行,或导致页面卡在某个状态上,给用户的体验很差. 一直以来,JavaScript处理异步都是以callback的方式,在前端开发领域callback机制几乎深

JS - Promise使用随笔

一.promises相关概念 promises 的概念是由 CommonJS 小组的成员在 Promises/A 规范中提出来的. 1,then()方法介绍 根据 Promise/A 规范,promise 是一个对象,只需要 then 这一个方法.then 方法带有如下三个参数: 成功回调 失败回调 前进回调(规范没有要求包括前进回调的实现,但是很多都实现了). 一个全新的 promise 对象从每个 then 的调用中返回. 2,Promise对象状态 Promise 对象代表一个异步操作,其

[转]JS - Promise使用详解2(ES6中的Promise)

原文地址:https://www.hangge.com/blog/cache/detail_1638.html 2015年6月, ES2015(即 ECMAScript 6.ES6) 正式发布.其中 Promise 被列为正式规范,成为 ES6 中最重要的特性之一. 1,then()方法 简单来讲,then 方法就是把原来的回调写法分离出来,在异步操作执行完后,用链式调用的方式执行回调函数. 而 Promise 的优势就在于这个链式调用.我们可以在 then 方法中继续写 Promise 对象并

【WP8】同步执行异步代码

微软的StorageFile只支持异步的方式进行文件操作,我之前也封装过一个StorageHelper,但是当所有的方法都是异步的时候也带来一些问题 1.比如我们不能在构造函数调用异步代码(等待), 2.比如我们在离开App的时候我们需要对数据进行快速的保存(在事件中),这个时候就不适合用异步了,异步可能会导致保存失败,因为App已经不在前台了 最近就遇到了一个这样的需求 我封装了一个SqliteHelper类,提供了一些数据库操作的一些常用方法,在数据库使用之前,需要保证数据库路径的文件夹是存

JS 动态加载脚本 执行回调[transfer]

JS 动态加载脚本 执行回调 关于在javascript里面加载其它的js文件的问题可能很多人都遇到过,但很多朋友可能并不知道怎么判断我们要加载的js文件是否加载完成,如果没有加载完成我们就调用文件里面的函数是不会成功的.本文讲解怎么在js中加载其它js文件并在加载完成后执行回调函数. 我们可以动态的创建 <script> 元素,然后通过更改它的 src 属性来加载脚本,但是怎么知道这个脚本文件加载完成了呢,因为我们有些函数需要在脚本加载完成生效后才能开始执行. 经过对网络上资源的搜索,我发现

从setTimeout到浏览器线程机制 ,实现JS线程和UI同时执行的效果

遇到一个问题情况: ocx读取多条记录的结果集. 在js里用 for遍历. for(var i= 0;i<length;i++){ $.ajax({ 后台返回结果 处理成功, 调用更新进度条的方法. }) } 发现,总是当for全部遍历完成,才去渲染进度条控件.更改样式. 查阅N多资料更改后, 将for改为递归调用,没执行一次,渲染一次进度条,后面的JS代码放在setTimeout(function,0),这时浏览器会优先渲染UI界面,然后在执行后面的JS代码,就实现了进度条实时更新了. //更

JS 动态加载脚本 执行回调

JS 动态加载脚本  执行回调 关于在javascript里面加载其它的js文件的问题可能很多人都遇到过,但很多朋友可能并不知道怎么判断我们要加载的js文件是否加载完成,如果没有加载完成我们就调用文件里面的函数是不会成功的.本文讲解怎么在js中加载其它js文件并在加载完成后执行回调函数. 我们可以动态的创建 <script> 元素,然后通过更改它的 src 属性来加载脚本,但是怎么知道这个脚本文件加载完成了呢,因为我们有些函数需要在脚本加载完成生效后才能开始执行. 经过对网络上资源的搜索,我发