前言
允诺对象可以理解为一次
执行的
操作(通常用于异步操作)。以承诺对象后,可以用链调用方式使代码更直观的组织代码,因为一个
方法如promise.all的存在,它可以使它更容易执行多个操作的同时。
承诺的上升是由于回调
函数在异步调用中调用回调函数时
经常发生的事实,这种
情况导致了一个回调到金字塔的出现,不仅代码编写困难而且不愉快,而且当问题复杂时,读代码的人很难理解。
例子如下:
Db.save(数据、
功能(数据){
做某事…
Db.save(DATA1,功能(数据){
做某事…
Db.save(data2,功能(数据){
做某事…
做的(数据); / /返回数据
})
});
});
假设有一个数据库
保存操作,和一个请求需要三台节省三的数据。所以我们的代码类似于上面的代码。二db.save怎么样基于这一考虑,我们也需要使用类似尝试的逻辑…在回调的每一层中捕获,这是万恶之源,也是节点刚刚开始批评的一个点。
另一个缺点是假设三个之间没有保持我们的依赖关系,我们仍然需要在函数前面
等待执行,为了执行下一步,要保存三个
并行,然后返回一个三保存结果。
不幸的是,当我开始接触节点时,我写了很多这样的地狱。
Later, because more of the front end code was written, I came into contact with ES6 and found a sharp tool to solve the callback abyss, Promise.
事实上,前6的承诺,Q,when.js、蓝知更鸟和其他图书馆已经建立了自己的承诺,以保证车轮标准(
参考承诺 / +)。
我认为阅读一篇文章是有意义的。它说,不要
扩展内置的
本地对象。这种方法不是面向未来的。所以这里有一个
提示:当使用扩展本机承诺的库时,您需要小心。
此处仅讨论本机承诺。
6承诺
承诺对象的状态
在承诺的
详细解释之前,第一点理论:
承诺+ +规范指定允诺对象是有限状态机。
它是三个州:
1,待定(执行)
2,实现(成功)
3,拒绝(拒绝)
其中挂起的是初始状态,满足和拒绝的是结束状态(结束状态表示承诺的生命周期结束)。
状态
转换的关系是:
待定>完成,挂起>拒绝。
状态转换将触发各种事件,例如成功事件的执行、失败的执行等。
承诺的形式
诺言看起来像这样:
新承诺(函数函数(解析,拒绝){)
/ /做某事,也许异步
如果(成功){
返回解析(数据);
{人}
返回拒绝(数据);
}
});
Promise.then(功能(数据){)
做某事,例如…
console.log(数据);
}函数(
错误){
ERR。交易
})
这里的可变承诺是允诺对象的一个实例。
允诺对象在
创建函数时执行逻辑函数中的逻辑。
当逻辑完成且没有错误时,解析回调将值传递到一个特殊的
位置。这个特殊的位置在哪里这是下面代码中的那个,然后我们使用回调函数来
处理解析结果。例如,在上面的代码中,我们只需将值输出到
控制台。如果出现错误,则在拒绝的第二个回调函数中处理错误。
利用上面的有限状态机理论,我们知道当在承诺构造函数中执行回调函数代码时,状态处于等待状态,并且状态在解析之后完成,并且状态在拒绝后被拒绝。
保证数据流
以上是承诺的第一个数据流。
与有趣的相比,承诺的方法仍然可以返回到允诺对象,这样我们就可以在下一个过程中做同样的处理了。
第一个两个回调函数然后决定第一个返回的是什么样的允诺对象。
假设第一个第一个回调函数不返回一个允诺对象,那么第二个调用方仍然是原来的允诺对象,但是它的解析值在第一个回调函数中成为第一个值。
假设第一个然后第一个回调函数返回一个对象的承诺,二者成为新的承诺对象,第二然后等待新的承诺对象执行回调后
解决或拒绝。
虽然话有点,但我觉得我很清楚。哈哈。
如果在任何地方出现错误,则错误被传递到第一个第二个回调函数,然后返回第二个回调函数。
此外,允诺对象还有一个方法,catch,它接受回调函数来处理错误。
这是:
promise.catch(功能(ERR){)
ERR。交易
})
它是假定的错误处理是相似的,并且这种方法可以集中统一的错误。所以其他方法不需要二回调。
控制并发的承诺
希望有一个静态方法promise.all(注意不是承诺。原型),该方法接受一个元素,是保证对象数组。
这个方法也返回一个承诺的对象,如果数组中的所有对象的承诺解决,所以这些解决值将作为一个promise.all数组作为返回值的方法(承诺)的解决价值,然后可以再方法。如果数组中的任何承诺是拒绝,那么拒绝价值是promise.all方法的返回值的剔除值。
非常重要的一点是:
该方法的第一个回调函数接收解决价值(如上面提到的,是一个数组),这是在相同的
顺序在promise.all
参数数组,而不是按时间顺序
排序。
还有一种方法类似于promise.all,promise.race,并接收一个数组,但它只接受第一个被解决的价值。
将其他对象转换为承诺对象
的promise.resovle方法可以返回一个承诺对象作为参数,并返回一个承诺对象。
有两个案例:
假设传入参数没有A,然后方法,则返回的允诺对象变成解析状态,解析的值是对象本身。
假设
输入参数有一个方法(称为thenable对象),该对象的
类型改变的承诺,和它的方法成为promise.prototype.then方法。
承诺是异步解决方案吗
最后要说的事是,承诺的
作用是解决回调金字塔的问题,这实际上并没有控制异步过程中发挥着重要的作用。以保证控制的异步过程,我们也使用ES6生成器函数。(例如,Tj God的
公司库的实现)。
然而,ES7将有一个更激进的解决方案:异步/等待,这是类似于CO,但与
原生支持。观望。
总结
以上是Javascript ES6本土承诺的全部内容,希望本文的内容将帮助您了解ES6。如果您有任何问题,你可以沟通。