• 赚钱入口【需求资源】限时招募流量主、渠道主,站长合作;【合作模式】CPS长期分成,一次推广永久有收益。主动打款,不扣量;

JavaScript Promise API

JavaScript cps12345 1年前 (2020-06-16) 200次浏览 0个评论

尽管同步代码更易于跟踪和调试,但异步通常在性能和灵活性方面更好。当您一次触发多个请求,然后在每个请求准备就绪时处理它们时,为什么要“暂缓演出”呢?承诺正在成为JavaScript世界的重要组成部分,许多新API都以promise理念实现。让我们来看看Promise,API及其用法!

在野外的应许

当XMLHttpRequest API是异步但并  没有使用承诺API。但是,现在有一些本机API使用Promise:

承诺只会变得更加普遍,因此所有前端开发人员都必须习惯它们,这一点很重要。还值得注意的是,Node.js是Promises的另一个平台(显然,Promise是核心语言功能)。

测试promise可能比您想象的setTimeout要容易,因为它可以用作异步“任务”!

基本承诺用法

new Promise()构造函数应该只用于传统异步任务,就像使用setTimeoutXMLHttpRequest。一个新的承诺与创建new关键字,并承诺提供resolvereject功能提供的回调函数:

var p =  new  Promise function  resolve  reject  {
	
	//执行异步任务异步任务然后...

	如果/ *状况良好* /  { 
		解决'成功!' ; 
	} 
	else  { 
		拒绝“失败!” 
	} 
} ;

p 然后函数结果 {  
	/ *做一些事情,结果* / 
} catch 函数 { 
	/ *错误:( * / 
} 最终函数 { 
   / *执行失败或成功失败* /  
} ;

由开发人员根据他们给定任务的结果手动调用resolvereject在回调的主体内。一个现实的例子是将XMLHttpRequest转换为基于promise的任务:

//从Jake Archibald的Promises and Back:
// http://www.html5rocks.com/en/tutorials/es6/promises/#toc-promisifying-xmlhttprequest

函数 get  url  { 
  //返回新的诺言。
  返回 新的 承诺函数决心拒绝 { 
    //做平常XHR东西
    VAR REQ =   的XMLHttpRequest ; 
    REQ 开放'GET' 网址;

    REQ 的onload =  函数 { 
      //这被称为甚至在404等等
      //所以检查状态
      ,如果  REQ 状态==  200  { 
        //解决与响应文本的承诺
        的决心 REQ 响应; 
      } 
      否则 { 
        //否则执行状态文本拒绝
        //相信能是一个有意义的错误
        拒绝错误 REQ 状态文本; 
      }
    } ;

    //处理网络错误 
    req onerror =  function  { 
      拒绝错误“网络错误” ))
    } ;

    //发出请求 
    req 发送; 
  } ; 
}

// 用它!
get 'story.json' 然后功能响应 { 
  控制台日志“成功!” 响应; 
}  功能错误 { 
  控制台错误“失败!” 错误; 
} ;

有时候,你并不  需要完成的承诺中异步任务-如果它  可能是一个异步将采取行动,然而,返回承诺将最好的,让您可以随时在承诺未来数给定函数的出。在这种情况下,您可以简单地调用Promise.resolve()Promise.reject()不使用new关键字。例如:

var userCache =  { } ;

function  getUserDetail  username  { 
  //在两种情况下,无论是否缓存,都将返回promise

  if   userCache [ username ]  { 
  	//返回没有“ new”关键字的promise 
    return Promise 解析 userCache [用户名] ; 
  }

  //使用fetch API获取信息
  // // fetch返回promise 
  return  fetch 'users /'  +用户名+  '.json' 
    然后函数结果 { 
      userCache [用户名]  =结果; 
      返回结果; 
    } 
    catch function  { 
      抛出  错误'找不到用户:'  +用户名; 
    } ; 
}

由于总是返回承诺,因此您可以始终在其返回值上使用thenand catch方法!

然后

所有的Promise实例都有一种then方法,可以让您对Promise做出反应。第一个then方法回调接收resolve()调用给定的结果:

新的 Promise function  resolve 拒绝拒绝)) { 
	//使用setTimeout 
	setTimeout function  {  resolve 10 ;  }  3000 ; 
}的模拟异步动作
然后函数结果 { 
	控制台日志结果; 
} ;

//从控制台:
// 10

then时承诺解决触发回调。您还可以链接then方法回调:

新的 Promise function  resolve 拒绝拒绝)) {  
	//使用setTimeout 
	setTimeout function  {  resolve 10 ;  }  3000 ; 
}的模拟异步动作
然后函数 num  {控制台日志'首先然后:'  num ;  返回 num *  2 ; } 
然后函数 NUM  {控制台登录'第二然后:'  NUM ;  返回 NUM *  2 ;  } 
然后函数 NUM  {控制台登录'最后则:'  NUM ; } ;

//从控制台:
//首先,然后:10 
//第二,然后:20 
//最后,然后:40

每个then 接收前一个then的返回值的结果。

如果一个承诺已经解决但又then被再次调用,则回调将立即触发。如果Promise被拒绝,并且您then在拒绝后调用,则永远不会调用该回调。

抓住

catch时的承诺被拒绝执行回调:

 Promise function  resolve 拒绝  reject { 
	//使用setTimeout 
	setTimeout function  {  reject 'Done!' ;  }  3000 ; 
} )的
模拟异步动作然后函数 e  {控制台日志'完成'  e ;  } 
功能 e  {控制台log 'catch:'  e ;  } ;

//从控制台:
//'catch:完成!'

您提供的reject方法完全取决于您。常见的模式是发送Errorcatch

拒绝错误'找不到数据' ;

最后

finally无论成功与否,都会调用新引入的回调:

新的 Promise 决心拒绝 = >  {  拒绝“ Nope” ;  } 
    然后 = >  {控制台登录“成功”  } 
    捕捉 = >  {控制台日志“失败”  } 
    最后res = >  {控制台log “ finally”  } 

// >>失败
// >>终于

Promise.all

想想JavaScript加载程序:有时候您会触发多个异步交互,但只想在所有异步交互完成后才响应-就是这样Promise.all。这种Promise.all方法采用了一组promise并在它们全部解决后触发一个回调:

答应全部[ promise1  promise2 ] 然后函数结果 { 
	//都兑现了
} 
catch 函数错误 { 
	//一个或多个诺言被拒绝
} ;

一种完美的思考方式Promise.all是一次触发多个AJAX(通过fetch)请求:

var request1 =  fetch '/users.json' ; 
var request2 =  fetch '/articles.json' ;

答应全部[ request1  request2 ] 然后函数结果 { 
	//两个诺言都完成了!
} 

您可以将API fetch和Battery API 结合使用,因为它们都会返回承诺:

答应所有[ '/users.json' )导航仪getBattery ] 然后函数结果{ //两个诺言都完成了!}  
	

当然,应对拒绝是很难的。如果任何承诺被拒绝catch,则第一个拒绝的行为将被取消:

VAR REQ1 =   无极功能决心拒绝 {  
	//有模拟的异步使用的setTimeout动作
	的setTimeout 函数 {  解析'第一!' ;  }  4000 ; 
} ; 
var req2 =  new  Promise function  resolve  reject  {  
	//使用setTimeout 
	setTimeout的模拟异步操作function  {  reject 'Second!' ;  }  3000 ; 
} ; 
答应全部[ req1  req2 ] 然后函数结果 { 
	控制台登录'然后:' 结果; 
} catch 函数 err  { 
	控制台log 'Catch:'  err ; 
} ;

//从控制台:
//捕获:第二!

Promise.all 随着越来越多的API实现承诺,它将非常有用。

Promise.race

Promise.race是一个有趣的功能-无需等待所有诺言被解决或拒绝,Promise.race而是在数组中的任何诺言被解决或拒绝时立即触发:

var req1 =  new  Promise function  resolve  reject  {  
	//使用setTimeout 
	setTimeout function  {  resolve 'First!' ;  }  8000 ; 
} )的模拟异步操作
var req2 =  new  Promise function  resolve  reject  {  
	//使用setTimeout 
	setTimeout的模拟异步操作function  {  resolve 'Second!' ;  }  3000 ; 
} ; 
答应种族[ req1  req2 ] 然后函数一个 { 
	控制台登录'然后:' 一个; 
} 功能 { 
	控制台log 'Catch:' 一个; 
} ;

//从控制台:
//然后:第二!

用例可能会触发对主要来源和次要来源的请求(如果主要来源或次要来源不可用)。

喜欢 (0)

您必须 登录 才能发表评论!