允诺异步问题的详细解释

允诺异步问题的详细解释
到目前为止,每个Javascript开发者和他们的祖母有过承诺。如果你没有,那么你会承诺的概念是由在承诺CommonJS组成员提出 /规范。承诺逐渐作为一种方法来管理异步运行回调,但他们的设计,他们远比这更有用。事实上,因为他们的许多用途,无数的人告诉我,我写了一些关于承诺后,我错过了承诺的焦点。那么什么是承诺的重点
有关的承诺

在我开始之前承诺的重点,我想我应该给你一点点的他们是如何工作的。承诺是一个对象按照承诺 /规范-只有一个方法:然后,然后,方法有三个参数:一个成功的回调,一个失败的回调,回调(和前进的规范不包括了回调,但其中许多实施实现)。一个新的承诺对象是返回调用每个然后。

一个承诺可以三种状态:未完成,完成,或失败。承诺在未完成状态开始,如果成功,这将是一个完整的状态,如果失败将是失败的。当一个承诺行动的完整状态,所有注册成功的回调函数将被调用,而成功的结果值将被传递给它。此外,任何成功的回调注册承诺将建成之后立即调用。
同样的事情发生在保证移动到一个失败的国家,除了它所谓的失败,而不是成功回调回调,实现含转发的功能,保证可以更新进度随时离开未完成的状态。当进度更新,所有前进的回调(进度回调)将通过对进步的价值和被称为立即。远期回调中的不同处理方式对成功和失败的回调。如果在进度更新发生后注册了前向回调,则新的前回调将在更新的进程注册后才调用。

我们不深入研究承诺状态是如何管理的,因为它不在规范之内,并且在每个实现中都有差异。
处理回调

如前所述,异步操作处理回调函数是最基本的、最常用的承诺。让我们比较标准回调和使用承诺的回调。
回调用法正常
asyncoperation(函数(){()
您的回调
});
` asyncoperation `返回一个承诺 / /现在
asyncoperation()。然后(函数(){()
您的回调
});
我想知道是否有人真的关心使用承诺,如果他们看到这个例子,它看起来不太好,但是在异步操作完成后,回调函数被调用似乎更明显,但是即使有了这个好处,我们现在有了更多的代码(抽象应该使我们的代码更短,不是吗)而且承诺比标准回调还要糟糕一点。

但不要让它阻止你,如果这是诺言能做的最好的事情,这篇文章就不会存在。

一个坏的皮拉米德
使用 / /正常回调= >金字塔doooooooom
asyncoperation(功能(数据){)
用数据做的一些处理
AnotherAsync(功能(数据){)
与` DATA2 ` / /更多的处理
YetAnotherAsync(function(){()
我们完了 / /耶!
});
});
});
看看使用承诺
asyncoperation()
然后(函数(数据){)
用数据做的一些处理
返回anotherasync();
})
。然后(功能(数据){)
与` DATA2 ` / /更多的处理
返回yetanotherasync();
})
然后(函数(){())
我们完了 / /耶!
});
你可以看到,承诺的使用让事情平和更具可读性。这是因为如前所述,然后返回一个承诺,所以你可以连接电话,承诺返回然后加载该调用返回的值。如果调用返回一个承诺(在这种情况下),承诺返回相同的值,然后加载加载你的回调函数返回的承诺。有很多这样的,所以我会帮助你了解它一步一步

异步操作返回一个承诺的对象。所以我们称当时那个承诺的对象并将其传递给回调函数;然后将返回一个承诺。当异步操作完成时,它将加载数据的承诺。然后(第一次)回调被调用,和数据是通过在参数。如果回调函数没有返回值,那么返回的承诺将立即无价值组件。如果回调函数不是一个承诺,然后承诺的将立即加载,然后返回值。如果回调函数返回一个承诺(为例),承诺归还通过将等到承诺我们回到回调是完全加载。一旦我们回调的承诺加载,加载的值(在本例中,2)将提交给随后的承诺。然后承诺装载数据等u3002it听起来有点复杂,但它其实是很简单的,我很抱歉,如果我说你不懂,我我可能不去谈论它的最好的人。

用命名回调替换

但是很明显,承诺并不是使这个结构扁平化的唯一途径,在写了一篇文章提到了承诺解决皮拉米德问题之后,一个人评论了这篇文章…

我认为承诺有时候是有用的,但是嵌套回调问题(圣诞树综合症)可以被命名函数替换为参数而不是匿名函数。
asynccall(参数,param2,handlercallback);
功能handlercallback(呃,RES){
做某事
}
它的例子只给出了一个很深的例子,但它仍然是正确的。

命名回调
使用 / /正常回调= >金字塔doooooooom
asyncoperation(handler1);
功能handler1(数据){
用数据做的一些处理
AnotherAsync(handler2);
}
功能handler2(2){
与` DATA2 ` / /更多的处理
YetAnotherAsync(handler3);
}
功能handler3(){
我们完了 / /耶!
}
看看上面的代码!他们绝对正确!这是一个平面结构,但也有在旧回调例子的问题我从来没有注意过的:依赖和重用。依赖性和可重用性是相互可逆的类型,不一样的是,更大的可重用性。在上面的例子中,handler1依靠handler2和handler2取决于handler3。,这意味着handler1不能用于任何目的,除非提出handler2。如果你不打算使用命名函数的意义是什么

最糟糕的事情是发生在handler2 handler1不在乎的。它不需要handler2但异步工作。所以让我们消除这些依赖关系,通过承诺使函数的可重用性。

链回调
asyncoperation()。然后(handler1)。然后(handler2)。然后(handler3);
功能handler1(数据){
用数据做的一些处理
返回anotherasync();
}
功能handler2(2){
与` DATA2 ` / /更多的处理
返回yetanotherasync();
}
功能handler3(){
我们完了 / /耶!
}
是不是好多了如果其他功能的存在,现在handler1和handler2彼此是不相关的,你想看看如果他们真的很了不起吗现在handler1使用不handler2的需要。相反,当handler1操作,我们将能够使用另一个处理器。

多重功能
asyncoperation()。然后(handler1)。然后(anotherhandler);
功能handler1(数据){
用数据做的一些处理
返回anotherasync();
}
功能anotherhandler(2){
做一些你从未见过的非常棒的东西。它会给你留下深刻印象
}
现在handler1脱离了handler2可在更多的情况下,通过handler2特别提供的,我们不想用的。这是可重用性!只有这样的批评家,解决了代码的可读性是通过消除压痕。我们不想只是为了消除压痕压痕,压痕是多只错一个符号,这个问题不见得是。他像一个头痛造成脱水。真正的问题是脱水,而不是头痛。解决的办法是得到滋润而不是使用一些止痛药。

并行异步操作

在我以前的文章提到的,我比较的承诺和事件处理异步操作。不幸的是,我不是很成功,根据那些在评论中提到的评论。我描述了承诺的力量,然后移动到事件描述他们的力量,因为它是用在我的特殊项目。没有比较和对比。一位评论家写道(有语法错误):

我想用文章中的例子来对比一下,一篇论文证明了承诺的价值。如果按假想的启动服务器按钮,它不仅启动Web服务器,而且还拥有数据库服务器。当他们运行时,他们只更新UI。

使用承诺的方法将使这种多重异步操作成为通用的。然而,对多个异步事件的响应需要一个共同的代码量。

他说的完全正确,事实上,我并不比较这两种情况,这篇文章的要点是,承诺不是异步操作的唯一机制,在某些情况下,它们并不一定是最好的,在评论员的情况下,承诺是最好的解决方案,当然,让我们看看他说了什么。

jQuery有一个名为时的方法,它可以接受任意数量的承诺参数并返回一个承诺。如果任何一个承诺传递失败,由时间返回的承诺将失败。如果所有的承诺都被加载,每个值将按照承诺定义的顺序传递给额外的回调。

用并行方式执行无数次异步操作是非常有用的,然后在每一个异步操作之后继续回调,让我们看一个简单的例子。

jquery.when
这些异步函数返回/承诺
VaR生机勃勃= asyncoperation1();
无功promise2 = asyncoperation2();
无功promise3 = asyncoperation3();

美元。当(生机勃勃,promise2,promise3)。然后(
(value1,value2,函数值){
对返回值中的每一个都做一些事情。
}
);
人们常说,这是承诺带来的最好的东西之一,也是承诺的重要意义的一部分。我还认为这是一个很好的特性,它简化了许多操作,但在任何一个承诺规范中都没有提到方法的机制。所以我不认为这是承诺的意思。一个规范是指当方法,但它是从上面的完全不同。据我所知,jQuery是实现这种方法的唯一的图书馆时,图书馆等承诺,如Q,道场时,实施时按承诺的方法 / B规格,但没有实现当方法注解者。然而,Q图书馆拥有所有的方法。when.js还具有一个并行的方法,像上面的jquery.when方法,但他们接受数组类型参数而不是任意数量的参数。

值的表示

承诺是处理以下场景的更好方法:

我想在这个数据库中找到一个用户,但是find方法是异步的。

因此,这里有一个不能立即返回的find方法,但最终它会返回一个值(通过回调),并希望以某种方式处理该值。现在,通过使用回调,您可以定义一个持续部分,或者稍后将处理该值的一些代码。

承诺改变了,嘿,这里有一些代码,你会发现你用来处理返回值,他们是一些信息,允许查找说嘿,我会忙着寻找你要找的信息,但同时,你可以继续等待返回结果,你可以用任何你想要的方式做,就像真实的事情一样。

承诺代表了真正的价值,这就是陷阱,当你处理诺言的时候,它们就像你对待真实的东西一样工作,承诺的Javascript实现要求你传递一个回调函数给它,这只是一个巧合,这不是一件重要的事情。

我相信这是承诺的焦点,为什么读诺言的第一句话,一个承诺代表了一个操作的最终返回值,这让它显得很明显,不是吗好吧,即使这是重点,它也不能阻止我在文章后面提出别人的想法。

结论

承诺的重点在于它代表的最终结果值的操作返回的,但使用它们的原因是使同步操作更平行。由于异步编程进入了这个场景,有弹出回调无处不在,以一种奇怪的方式来支付我们的代码。承诺是一种方法来改变它的承诺。让我们以同步的方式编写代码,同时给我们的代码的异步执行。

tag:解释异步详细电脑软件

相关内容