手机版

承诺函数的奥秘

时间:2021-08-30 来源:互联网 编辑:宝哥软件园 浏览:

承诺概述

Promise对象是CommonJS工作组提出的规范,旨在为异步操作提供统一的接口。

那么,什么是承诺?

首先它是一个对象,也就是说它和其他JavaScript对象没有什么区别;其次,它充当代理,并充当异步操作和回调函数之间的中介。它使异步操作有同步操作接口,使程序有正常的同步操作流程,回调函数不需要层层嵌套。

简单来说,思想是每个异步任务立即返回一个Promise对象,所以可以采用同步操作的过程。这个Promises对象有一个then方法,它允许您指定在异步任务完成后要调用的回调函数。

Promise的then方法可以接受前一个函数的执行结果,并保证另一个Promise的顺序执行。这是怎么发生的?

示意图(先上图)

问题需求

如何确保多个承诺按顺序执行?

示例:

var f1=function (){返回新的Promise(function(解析,拒绝){ setTimeout(function(){ console . log(' f1 ok!')解析(' f1 ok!');}, 1000) });}var f2=function (){返回新Promise(function(解析,拒绝){ setTimeout(function(){ console . log(' F2 ok!')解析(' f2 ok!');}, 3000) });}var f3=function (){返回新Promise(function(解析,拒绝){ setTimeout(function(){ console . log(' F3 ok!')解析(' f3 ok!');}, 2000) });}当然,如果我们想平行,我们很容易想到Promise.all方法:

Promise.all([f1(),f2(),f3()])。然后(函数(数据){ console.log(数据)})//f1 ok!//f3好!//f2 ok!//['f1 ok!',‘F2 ok!’,f3 ok!]如果要按顺序执行:

f1()。然后(f2)。然后(f3)//f1 ok!//f2 ok!//f3好!//或函数f(all){ var promise=promise . resolve();全部。foreach ((p,index)={promise=promise。然后(p)})} f ([f1,F2,F3])然后问题来了。然后如何按顺序执行?参数可以是普通函数,也可以是返回promise的函数。

那时的神秘

许多实现promise的库都很复杂。如果您自己实现它们,您可以从下面的简单代码中学习:

promise . prototype . then=function(on fulfilled,on expected){ var promise=this;返回新的Promise(函数(解析,拒绝){函数句柄(值){ var ret=type of onFulfilled==' function ' on fulfilled(值)| | valueif(ret type of ret[' then ']=' function '){ ret . then(function(value)){ resolve(value);},函数(原因){ reject(原因);});} else { resolve(ret);} } function errback(reason){ reason=type of OnReject==' function ' OnReject(reason)| | reason;拒绝(原因);}如果(答应。_status==='PENDING') { promise。_resolves.push(句柄);答应我。_ rejects . push(err back);} else if(承诺。_ status===PROCESSED){回调(promise。_ value);} else if(承诺。_status===REJECTED) { errback(承诺。_原因);} });}关注then的实现,看上面的代码,每个then返回的是一个新promise,一个新promise,一个新Promise,第二点是内部处理一个回调函数,判断运行结果是Promise,如果是,等待Promise运行后再调用resolve改变状态。关键是解析的调用时机,解析的调用时机只能向下执行。这两个步骤是发挥作用的关键。是不是有点晕?请看开头的图片。

摘要

以上就是本文的全部内容。希望本文的内容对大家的学习或工作有一定的参考价值。有问题可以留言交流。谢谢你的支持。

版权声明:承诺函数的奥秘是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。