promisejs原理(promise js 原理)
js的promise如何递归调用?
递归是Promise机制的核心之一:then方法返回另一个promise2,其内容是由回调方法的返回值决定的;回调中可以返回promise3,使外面的promise2的内容成为promise3的内容,也就是说,如果要用promise来递归,只需要在then回调中返回递归promise即可
举例如下:
//假如用jQuery
function get(url, p) {
return $.get(url + "?page=" + p)
.then(function(data) {
if(!data.list.length) {//递归结束条件
return [];
}
return get(url, p+1)//递归调用
.then(function(nextList) {
return [].concat(data.list, nextList);//合并递归内容
});
});
}
get("urlurl", 1).then(function(list) {
console.log(list);//your full list is here
});
promise原理是什么?
Promise用法为:
const promise = new Promise((resolve, reject) = { setTimeout(() = { resolve('success') })}).then(value = { ... }, reason = { ... })
Promise的构造函数接收了一个回调,这个回调就是执行器,执行器的参数resolve, reject也是两个函数,前者将promise改变为fulfiled,后者将其改变为rejected。可以在执行器内根据实际业务来控制是resolve或reject。
当promise状态变为fulfilled,所有onFulfilled将会按照最开始在then方法中注册的顺序去调用,当promise状态变为rejected,所有onRejected将会按照最开始在then方法中注册的顺序去调用。
then所属的Promise在pending状态,将then的回调(onFulfilled, onRejected)分别放入执行队列等待执行,而这两个队列内的函数只有在then所属的promise状态被改变的时候执行。保证了规范中的onFulfilled, onRejected的执行时机。
扩展资料:
promise返回的结果取决于shouldBePromise,假设shouldBePromise为false,那么promise就返回了字符串ok,下边就不能调用then方法。这个时候可以用Promise().resolve包起来,这样promise返回的始终是一个promise实例,保证了then方法的顺利调用。
假设promise被resolve了,由于then中传入了代表onFulfilled的回调并且返回值为success,那么promise的reason值为success。假设promise2被reject了,由于then中传入了代表onRejected的回调并且返回值为failed,那么promise的reason值是failed。
JS中promise对象的作用与使用
promise的作用:ajax是异步请求,多层嵌套会造成回调地狱,promise模拟同步,将异步回调类似于同步来处理业务逻辑。
var p = new Promise(function(){
//这里用于处理异步的回调
}),必传回调函数,不传程序会抛出异常。
创建实例对象时,回调函数会立即执行。
promise的三种状态:
pending:正在进行状态
fulfilled:完成状态
rejected:失败状态
传参1 resolve,是个函数,只要这个函数执行了说明是成功状态,参数2选传,rejecte,是个函数,这个函数执行了说明是失败状态。这两个只能执行一个,变化不可逆。
promise两种结果:
从进行到失败
从进行到成功
通过rejecte(data)h或者resolve(data)将异步响应的数据提取出来,在promise外部使用。
promise的then方法,用于处理成功或者失败的回调。
//接收上面的回调
var p1 =p.then(function(res){
})。执行后返回一个promise对象,但和p不是同一个对象。当p1执行了并且return出res,就可以连缀
p1=p.then(function(res){
return res
}).then(function(data){
//处理成功回调
}).catch(function(){
//处理失败回调
})
可以简写p.then(function(res){
//处理成功信息
},function(err){
//处理异常信息
})。但一般不这样写。
使用案例如下,
promise的then方法是异步方法,但会优先于定时器执行。
原生JS模拟Promise实现详解
作为一名程序猿,经常遇到回调函数的情况,原生js的回调函数是一层一层的嵌套调用,而es6提供了一种新的写法,Promise,它可以把原本的嵌套回调函数实现成横向的调用,即链式调用。
下面看一个Promise的简单用法:
接着开始模拟:
首先,_Promise构造函数会接收一个函数resolver并执行,函数中又包含resolve和reject两个参数,然后,_Promise构造函数生成的实例有三种状态,分别是pending(初始值)、fullfilled(成功)和rejected(失败),且由pending变为成功或者失败后状态不可逆。
resolve和reject函数执行的时候会先判断状态,如果是pending则执行,且将状态变为fullfilled或者rejected,并将resolve/reject函数中参数传递给_result,以便then函数调用时使用。
因为有可能存在链式调用,所以执行then函数的返回值需要判断,如果isResolve或者isReject函数返回的是一个新的_Promise实例,则返回这个实例,否则返回当前实例
至此,Promise已经模拟完成~