这里只讲promise,和async的使用方法,不会讲他们的原理。

Promise 是异步编程的一种解决方案,可以用于取代传统的回调函数,该变那些函数层层嵌套调用的尴尬局面。

1)promise

基本语法:

var p= new Promise(function(resolve,reject){
  if(....) resolve();
else reject(.....);
}); p.then(function(){//resolve
  .......
}).catch(function(){//reject
  .........
});

基本意思就是:每一个promise都有两种状态(对应着请求的pending->fulfiled,pending---->rejected)

pending->fulfiled:表示成功,执行then()的第一个回调函数

pending-->rejected失败,执行then()的第二个回调函数,一般我们更习惯用catch();更周全

demo01:使用vue,axios,promise演示一下promise到底是啥???

首先在组件中定义了一个getList()

getList(){
const self=this;
let promise=new Promise(function(resolve,reject){
/*
resolve((function(){
axios.get('./dataAction.php').then(function(res){
self.list=res.data; }).catch(function(error){});
return self.list
})());
*/
axios.get('./dataAction.php').then(function(res){
   self.list=res.data;
   resolve(res.data);
   }).catch(function(error){}); });

promise.then(function(res){
      console.log("我要等待axios请求之后再执行");
      console.log(res);
     }).then(function(){
});

 

在组件挂在之后就会触发这个方法,

mounted(){
  this.getList();
  //this.countMethod();
}

为了演示出效果我在php代码中做了延时处理:(目的是为了延时四秒之后返回结果,这样前端就是一个漫长的等待过程)

<?php
$dsn="mysql:dbname=vue;host=127.0.0.1";
$user="root";
$password='';
$db= new PDO($dsn,$user,$password);
$sta= $db->prepare("select * from res");
$sta->execute();
$arr=array();
while($row=$sta->fetch(PDO::FETCH_ASSOC)){
//print_r($row); $arr[]=$row;
}
$interval=;
sleep($interval);
print_r( json_encode($arr));
?>

你会发现确实过了四秒中上面那两句红色的才执行。。。。。。。。

既然现在框架ajax一般都有的自己promise,那我们何必要学习了??

现在我的需求是,有三个很普通函数,不涉及到请求,这三个函数都有一个延迟函数settimeout,返回一个数字,另外还有一个函数用于接受他们的返回参数,进行相加,返回结果??

按照我们的理解settimeout会在主程序执行完之后才执行,这样我们根本就不能获得相加的结果

demo02:

function mycount1(){
let a=;
setTimeout(()=>{ return a;},);
//resolve(a);
},
function mycount2(){
let b=;
setTimeout(()=>{resolve(b);
},);
},
function countAll(a,b){
  return a+b;
}
var a=mycount1();
var b=mycount2();
countAll(a,b);

现在我们有了promise,那么这一切就好说了

因为有多个执行过程,这个时候我想到了promise.all([......]).then();

语法作用就是all([.....])中可以有多个promise对象,等他们都执行成功之后才会触发后面的then(),,[前提是都执行成功之后]


function mycount1(){
  return new Promise(function(resolve,reject){
  let a=4;
  setTimeout(()=>{resolve(a)},1000);
  //resolve(a);
});

  /*
    return Promise.resolve((function(){
    setTimeout(()=>{return 4},4000);

    })())
  */
};

function mycount2(){
  let b=6;
  return new Promise(function(resolve,reject){
  setTimeout(()=>{resolve(b);},5000); });
};

function countAll(a,b){
  console.log("我是最后执行的");
  console.log(a+b);
};

const m1=mycount1().then((a)=>{console.log(a); return a;});
const m2=mycount2().then((b)=>{console.log(b); return b;});

//此时m1,m2都是promise对象
Promise.all([m1,m2]).then(function([a,b]){
  countAll(a,b);
});

这里在给一个promise.all([])的例子

    getList3(){
const self=this;
const a1=axios.get('./dataAction.php');//axios请求之后返回一个promise
const a2=axios.get('./dataAction.php');//axios请求之后返回一个promise
//两个promise返回两个参数,因此我们就用数组接受参数(如果只用一个参数接受,他会自动变成一个数组)
//首先promise.all的参数是promise数组集合
Promise.all([a1,a2])
.then(([r1,r2]) => {
console.log(r1);
// let arr=[];
//arr.push(...r1);
     console.log(r2);
});
},

mounted(){
  //this.getList();
  //this.countMethod();
  this.getList3();
}


讲了这么多不是为了好玩,在项目中我们是不是有很多情况下,是需要在某一个函数执行完之后再执行另一个函数的,

例如页面的加载完之后,或者dom树加载完之后,当然学过js的同学知道,页面加载有一个document.readyState的几个状态

https://developer.mozilla.org/zh-CN/docs/Web/API/Document/readyState

然后就有了我们经常用的

1)网站所有的资源都加载完毕才执行

window.onload=function(){};

2)dom树加载完之后执行,先于window.onload;

$(function(){});//或者$(document).ready(function(){......});

当然promise还有其他的api,你可以google自己学习下,

例如:Promise.resolve(.....)可以将一个非promise对象包装成一个promise,这样就可以使用then方法了

一个使用示例:

 获取一条数据的详情
function getItem(obj){
return new Promise(function(resolve){
management_api.getItem(obj).then(function(res){
if(res.data.ResultFlag === ''){
var itemModel = res.data.ResultValue;
var newItemModel ={
TplNumber : itemModel.TplNumber,
PdDate:new Date($filter('mydate')(itemModel.PdDate,'yyyy-MM-dd'));
XsFiles:itemModel.XsFiles ||[],
};
resolve(newItemModel);
}
}).catch(err){
console.log("you have an err");
};
});
}
//重置
$scope.reset = function(){
if(!$scope.id){
$scope.itemModel = {
TplNumber :'',
Name:'',
Brief:'',
PdDate:''
}; }
else{
getItem({id:$scope.id}).then(function(res){
$scope.itemModel = res;
});
//$scope.itemModel = Object.assign({},$scope.itemModel,{id:$scope.id});
$scope.itemModel = {
...$scope.itemModel,
id:$scope.id };
} }

promise的使用示例:

var getLynID =(function(){
  return new Promise(function(resolve,reject){
    lyn_api.getHireItem({....}).then(function(res){
      .....
      resolve(res);
    }).catch(function(err){//reject(err); console.log(err)})
  });  
})(); var getHireName = (function(){
  return new Promise(function(resolve,reject){
    lyn_api.getLymList().then(function(res){
      ....
      resolve(rse);
    }).catch(function(err){
      reject(err);
    });
  })
})(); Promise.all([getLynID,getHireName]).then(function(val){
  var HireID = val[0];
  var HireName = val[1];
  ...... })

promise的学习心得记录的更多相关文章

  1. 学习心得记录:[一]sql安装与配置

    时间:2015年9月13日 02:43:09 科目:mysql的安装 笔记: 准备: 1.首先下载解压版的mysql 2.将下载好的文件放到c:\Program Files\MYSQL下(mysql文 ...

  2. [Python 学习]2.5版yield之学习心得 - limodou的学习记录 - limodou是一个程序员,他关心的焦点是Python, DocBook, Open Source …

    [Python 学习]2.5版yield之学习心得 - limodou的学习记录 - limodou是一个程序员,他关心的焦点是Python, DocBook, Open Source - [Pyth ...

  3. 我的MYSQL学习心得(一) 简单语法

    我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  4. 我的MYSQL学习心得(四) 数据类型

    我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(五) 运 ...

  5. 我的MYSQL学习心得(六) 函数

    我的MYSQL学习心得(六) 函数 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...

  6. 我的MYSQL学习心得(七) 查询

    我的MYSQL学习心得(七) 查询 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...

  7. 我的MYSQL学习心得(八) 插入 更新 删除

    我的MYSQL学习心得(八) 插入 更新 删除 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得( ...

  8. 我的MYSQL学习心得(九) 索引

    我的MYSQL学习心得(九) 索引 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...

  9. 我的MYSQL学习心得(十) 自定义存储过程和函数

    我的MYSQL学习心得(十) 自定义存储过程和函数 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心 ...

随机推荐

  1. MongoDB 3.4 分片 由副本集组成

    要在真实环境中实现MongoDB分片至少需要四台服务器做分片集群服务器,其中包含两个Shard分片副本集(每个包含两个副本节点及一个仲裁节点).一个配置副本集(三个副本节点,配置不需要仲裁节点),其中 ...

  2. Java截取图片的一部分并保存为40*40的图片

    @Test public void testImag() { try { String path = "E:/flower2.jpg"; int x = 11, y = 20, c ...

  3. tcpdump 使用实例

    详细的文档见tcpdump高级过滤技巧 基本语法 ========过滤主机--------- 抓取所有经过 eth1,目的或源地址是 192.168.1.1 的网络数据# tcpdump -i eth ...

  4. DSOFramer原有的接口说明

    (转自:http://blog.csdn.net/hwbox/article/details/5669414) DSOFramer原有的接口说明 =========================== ...

  5. Volatility2.4以上版本及fmem使用指南

    因为要做一个取证项目,需要用到volatility这款软件,网上很多教程已经是很多年以前的东西了,导致很多人在制作profile这一步就卡住了,今天解决了这个问题,记录在此,分享给大家共同学习 1.安 ...

  6. Java 方法重载与方法重写

    方法重载(Overload): 1.在同一个类中 2.方法名相同 3.参数的个数或类型不同 4.与方法的返回类型无关 5.与方法的修饰符无关 方法重写(Override): 方法重写必须是子类继承父类 ...

  7. keepererrorcode = connectionloss for 错误处理

    自己的环境在虚拟机上,于是使用同事的环境调试问题,发现无法初始化成功,提示keepererrorcode = connectionloss for,于是上网查了下资料整理如下: 1.对比代码中引用的j ...

  8. d3.js入门学习

    个人感觉前端数据可视化是个趋势,并且现在所在公司也是有做这块的项目,虽然我目前还没有接触到公司数据可视化的项目,但是,今后总是要接触的嘛. 今天看了一下公司目前所用的两种数据可视化工具---D3和EC ...

  9. learn go defer

    package main // 参考文档: // https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/06.4.md im ...

  10. 类中的迭代器__iter__

    什么是迭代器 有iter()函数返回,可以通过next(it)函数取值的对象就是迭代器 迭代器协议 迭代器协议是指对象能够使用next函数获取下一项数据,在没有下一项数据时触发一个StopIterat ...