在Javascript中的6本土承诺的初步分析

在Javascript中的6本土承诺的初步分析
前言

允诺对象可以理解为一次执行操作(通常用于异步操作)。以承诺对象后,可以用链调用方式使代码更直观的组织代码,因为一个方法如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。如果您有任何问题,你可以沟通。
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部