当前位置:首页 > 日记 > 正文

在Javascript编程中使用承诺

在Javascript编程中使用承诺
虽然承诺有自己的规格,目前保证图书馆是承诺的实现细节的不同,和一些API在意义甚至不同。但承诺的核心是相通的,它是当时的方法。在相关条款,承诺是指一个对象或函数,有一个方法可以触发具体的行为。

承诺可以有不同的实现,所以承诺核心规范没有讨论任何特定的实现代码。

首先看一下承诺核心解释的含义:看,这是需要写的结果。请参考这个结果,并考虑如何用代码编写它。

开始:以这种方式理解承诺。

承诺解决的问题是什么回调函数。例如,domission1()代表的第一件事。现在,我们想在做完这件事之后做下一件事。domission2(),我们要怎么做

看看我们的普遍回调模式first.domission1()说:如果你想这样做,给我domission2(),我会打电话给你结束后,它会:

复制代码代码如下:domission1(domission2);

什么是承诺模式你说domission1():不,是在控制我,你要改变它,你回给我一个特别的东西,然后我就用这件事来安排接下来的事情。这件特殊的承诺,这将变成这样:

复制代码如下:domission1()。然后(domission2);

正如你所看到的,承诺改变了回调模式的主要和从属关系(转向为主!)多个事件的过程关系可以集中在主干道上(而不是分散在各种事件函数中)。

那么,你怎么做出这样的改变呢在最简单的情况下,假设domission1代码是():

复制代码代码如下:功能domission1(回调){

var值= 1;

回调(值);

}

所以,它可以改变并转向这个:

复制代码代码如下:功能domission1(){

返回{

然后:函数(回调){

var值= 1;

回调(值);

}

};

}

这完成了转换,虽然它不是一个有用的转换,但它触及了最重要的实现点,即,承诺用方法将返回值转换为对象。

先进性:Q的设计

Start from defer

设计/ q0.js在Q的初始原型创建工具的功能称为延迟的第一步,这是用来创建承诺:
函数(){()
var,值;
返回{
解决:功能(_value){
价值= _value;
对于(var i = 0,II = pending.length;我< II;i++){
var回调=挂起的{ };
回调(值);
}
待定=未定义;
},
然后:函数(回调){
如果(挂起){
Pending.push(回调);
{人}
回调(值);
}
}
}
};
此源代码显示运行推迟()会得到一个包含解决方法然后想想jQuery的递延(以及解决之后),并且这两种方法将是相似的,然后会把待定的状态,如果是等待状态,保存回调(推),或回调调用。解决肯定的承诺,更新的价值,并运行所有保存的回调,使用实例推迟如下:

复制代码如下:var oneonesecondlater =函数(){()

var结果=延迟();

setTimeout(){()函数(

(1)result.resolve;

},1000);

返回结果;

};
OneOneSecondLater()然后(回调);

在这里,oneonesecondlater()包含异步内容(setTimeout),但它是立即返回所产生的一个对象,然后推迟()对象的解决方法是放置在异步的末端位置,它被称为(和附加值或结果)。

在这里,有一个问题:解决上面的代码可以执行很多次。因此,解决应增加判断的状态以确保解决只有一次是有效的。这是Q的设计/ q1.js下一步(区别):
解决:功能(_value){
如果(待定){
价值= _value;
对于(var i = 0,II = pending.length;我< II;i++){
var回调=挂起的{ };
回调(值);
}
待定=未定义;
{人}
抛出新错误(承诺只能解决一次。);
}
}
对于第二次和多次调用,您可以抛出一个错误并直接忽略它。

延迟与承诺分离

在实施前,由延迟产生的对象既有当时的方法和解决的方法。根据定义,承诺有关的方法,并为解决触发承诺改变状态,这又是另一回事。所以,问会有那么的那么的方法承诺,从推迟着决心分开,单独使用它。这样,它似乎已经明确各自的职责,只留下一定的权利,这将使代码更加清晰和易于调整。看设计/ q3.js:(Q2跳过这里)
VaR是希望=函数(值){
返回值类型的value.then =功能;
};

函数(){()
var,值;
返回{
解决:功能(_value){
如果(挂起){
价值= _value;
对于(var i = 0,II = pending.length;我< II;i++){
var回调=挂起的{ };
回调(值);
}
待定=未定义;
}
},
承诺:{
然后:函数(回调){
如果(挂起){
Pending.push(回调);
{人}
回调(值);
}
}
}
};
};
如果你比较Q1仔细,你会发现差异很小。另一方面,不再把错误(而不是直接忽略二次多解决),另一方面,移动然后方法命名的对象的承诺。在这里,对象(称为延迟运行延迟(酒吧)),会有解决的方法,和一个承诺属性指向另一个对象,其他对象只能用那方法的承诺。这就完成了分离。

还有一个是希望()函数确定一个对象是否是一个承诺(一种判断duck typing)的方法,是否有一种方法,为了正确地使用和处理分离的承诺,它会是这样的承诺和其他价值之间的区分。
实现承诺的级联

下一步是非常重要的一步,从前面到第三节,承诺的执行是不能级联的,但是你所知道的承诺应该支持这样的语法:

复制代码代码如下:promise.then(第一步),然后(STEP2);

以上过程可以理解,承诺将能够从旧的承诺(前一个代码中的值)创造新的承诺:

然后方法必须返回到承诺。

返回的承诺必须在回调运行到该方法之后返回结果的自身值。

传递给该方法的回调必须返回一个承诺或值。

设计/ q4.js,为了实现这一点,是增加了一个工具函数参考:

复制代码代码如下:var REF =函数(值){

如果(值类型的value.then =函数)

返回值;

返回{

然后:函数(回调){

返回引用(回调(value));

}

};

};

这是为了处理与承诺相关联的值。这个工具函数将包装任何值值一次,如果它是一个承诺,不做任何事情,如果没有承诺,把它包装成一个承诺。注意,有一个递归,它保证包装的承诺可以和那个方法级联:

复制代码如下:REF(step1)。然后(函数(值){)

console.log(价值); / / 的第一步

返回15;

}然后(函数(值){)

console.log(价值); / / 15

});

您可以看到值是如何传递的,级联的承诺也是如此。

设计/ q4.js将原推迟到级联形式结合本参考函数的使用:
函数(){()
var,值;
返回{
解决:功能(_value){
如果(挂起){
价值= REF(_value); / /价值包裹在一个承诺
对于(var i = 0,II = pending.length;我< II;i++){
var回调=挂起的{ };
Value.then(回调); / /然后叫代替
}
待定=未定义;
}
},
承诺:{
然后:功能(_callback){
var结果=延迟();
回调被包装,使其返回。
值被捕获并用于解析承诺。
返回
var回调函数(值){
result.resolve(_callback(值));
};
如果(待定){
Pending.push(回调);
{人}
Value.then(回调);
}
返回result.promise;
}
}
};
};
回调的原始形式(价值)改为value.then(回调),改性效果其实和原来一样,只是因为价值成为保证包装的类型,它需要被称为。

然后方法改变更多。一个新的延迟产生的第一,和延期的承诺还末。注意回调不再直接用于转移之后,但在添加一层的基础上,提出新的解决方法,将放在这里。这是可以理解的,当时的方法将返回一个新生成的承诺,所以承诺解决还保留。在旧承诺的解决方案运行之后,新承诺的解决方案也将运行,这样,就像管道一样,让事件按照一个连接层的内容在一层和一层传递。
添加错误处理

承诺的方法应包含两个参数的肯定和否定的状态处理功能(onfulfilled和onrejected),分别承诺,我们实现了在我们面前只能转化为一种积极的状态,所以负面状态部分应补充下。

需要注意的是,承诺的方法是可选参数的两参数。设计/ q6.js(Q5也跳过)添加工具功能拒绝帮助实现承诺的消极状态:
var拒绝=函数(原因){
返回{
然后:函数(回调,errback){
返回引用(errback(原因));
}
};
};

它与裁判之间的主要区别是,然后它返回的对象的方法与errback二参数运行。设计/ q6.js休息:
函数(){()
var,值;
返回{
解决:功能(_value){
如果(待定){
价值= REF(_value);
对于(var i = 0,II = pending.length;我< II;i++){
value.then.apply(价值,待{我});
}
待定=未定义;
}
},
承诺:{
然后:功能(_callback,_errback){
var结果=延迟();
默认的回调和errbacks / /提供
_callback = _callback函数(值){ | |
默认情况下,正向实现
返回值;
};
_errback = _errback功能(原因){ | |
默认情况下,前向拒绝
返回拒绝(原因);
};
var回调函数(值){
result.resolve(_callback(值));
};
无功errback =函数(原因){
result.resolve(_errback(原因));
};
如果(挂起){
Pending.push({回调,errback });
{人}
Value.then(回调,errback);
}
返回result.promise;
}
}
};
};
这里的主要变化是拯救列阵以待只在一个回调的形式保存2回调的正面和负面的形式。此外,默认的肯定与否定的定义,然后回调,然后方法满足的承诺2可选参数的要求。

您可能注意到,延迟中只有一种解析方法,并且没有类似于jQuery的拒绝。因此,错误句柄是如何触发的呢请看这个例子:
无功defer1 =推迟(),
defer1.promise生机勃勃=;
promise1.then(函数(值){)
console.log(1:价值=
返回拒绝(发生错误);
}然后(函数(值){)
console.log(2:价值=
}。然后(空,函数(原因){ })
console.log(3:原因:
});
(10)defer1.resolve;

结果:
1: =值10
原因=错误发生3:
正如您所看到的,每个传递传递函数的返回值是非常重要的,它将决定下一个方法调用的结果。如果返回到如上所述的工具函数拒绝生成的对象,将触发错误处理。
整合成异步

终于到了最后的设计/ q7.js.until的Q6的前面,有一个问题,当时的操作方法时,可以同步,可以是异步的,根据不同的功能通过后(如直接返回一个值,返回一个同步,其他的承诺,它是异步的)。这种不确定性可能导致潜在的问题。所以,在Q的一步是确保所有然后变成异步。

设计/ q7.js定义另一个工具功能,入队:

复制代码代码如下:var入队=函数(回调){

/ / process.nexttick(回调); / / Nodejs

setTimeout(回调,1); / /有浏览器的解决方案

};
显然,这个工具函数将把任何功能推迟到下一个事件队列运行。

设计/ q7.js其他修正点(只显示修改的部分):

var =函数(值){

返回{
然后:函数(回调){
var结果=延迟();

Enqueue(function(){()
result.resolve(回调(值));
});
返回result.promise;
}
};
};

var拒绝=函数(原因){
返回{
然后:函数(回调,errback){
var结果=延迟();

Enqueue(function(){()
result.resolve(errback(原因));
});
返回result.promise;
}
};
};

函数(){()
var,值;
返回{
解决:功能(_value){

Enqueue(function(){()
value.then.apply(价值,待{我});
});

},
承诺:{
然后:功能(_callback,_errback){

Enqueue(function(){()
Value.then(回调,errback);
});

}
}
};
};

那是,原来的value.then部分改为异步。

在这里,Q提供承诺的设计原则,Q0 ~ Q7,全。
后记

即使这篇文章篇幅如此之长,它只讲述了基本的承诺,大多数承诺库将有更多的API来处理与承诺相关的更多需求,如所有()、传播()。然而,读过这里,你已经知道了实现诺言的核心理念,它将帮助你在未来应用诺言。

在我看来,承诺是一个聪明的设计,我花了相当长的时间来理解它,作为一个典型的承诺库,Q在思想上是非常清楚的,可以感觉到一个复杂的库从基本点开始。如果我们想做类似的事情,我们应该保持这种心态。

以上是本文的全部内容,希望能对大家有所帮助。

相关文章

颜色、类型和空间如何影响情感的详

颜色、类型和空间如何影响情感的详

类型,空间,颜色,情感,详细,下面的教程详细分析了颜色、类型和空间是如何影响情绪的。这个教程很好。值得学习。建议像你这样的朋友和教程一起学习。 你有没有考虑过设计在设计时对情绪的影响情绪的影响可以分为两个方面:mdash;mdash;和用户的…

ps模仿邮票工具来删除不需要的图像

ps模仿邮票工具来删除不需要的图像

工具,图像,删除,不需要,邮票,本教程介绍了一个朋友,PS复制邮票工具,以消除不必要的图像方法。本教程是比较基础的,非常适合初学者学习。希望你能喜欢。 当我们需要的图片中有不必要的图像时,用ps软件去除不必要的图像的方法有很多种。这次我们…

ps回到20年前的入门教程

ps回到20年前的入门教程

入门教程,年前,电脑软件,ps,本教程是向朋友介绍PS回到20岁的方法。本教程的入门非常适合初学者学习。建议像你这样的朋友一起学习这个教程。希望你能喜欢。 PS教程回归到20岁 课程 方法/步骤 1,打开一个可以在软件中制作的图片。图片必须…

滑稽可笑的个性签名和个性签名

滑稽可笑的个性签名和个性签名

个性签名,滑稽,可笑,电脑软件,我买了一部新手机,开了一个飞行模式,把它扔到了7层,然后把它弄坏了! 经过17年的生活,我终于知道了我和超人之间的唯一区别。我真的把内衣放进去了。 我想给生命一个吻,但现实却给了我两个吻。作为奖励,我不能踢他吗 …

PS图象处理软件设计美丽的彩色玻璃

PS图象处理软件设计美丽的彩色玻璃

图象处理,软件设计,贴纸,效果,美丽,本教程是PS图象处理软件玻璃贴纸效果的设计方法引入到美丽多彩的朋友,的效果的教程很漂亮,但难度不难,很适合初学者学习,推荐,喜欢的朋友可以跟着教程学习。 本教程介绍朋友玻璃贴纸PS图象处理软件设计美丽多…

如何设置ps笔刷光标窗体

如何设置ps笔刷光标窗体

窗体,光标,如何设置,笔刷,电脑软件,如何设置ps笔刷光标窗体在使用ps的过程中,我们经常使用画笔工具。有时,我们的操作不当会导致光标形式发生变化,操作起来也不容易。接下来,我们需要共享设置方法。 在PS的使用中,我们经常使用画笔工具,有时我们…

PS图象处理软件梦幻中草药化妆品海

PS图象处理软件梦幻中草药化妆品海

中草药,图象,处理软件,海报,梦幻,这次我们做了一个有点梦幻感的化妆品海报,产品是水做的,原料是草药,让我们围绕这些要点进行头脑风暴,提炼出关键的材料和参考。 这次我们做了一个有点梦幻感的化妆品海报,产品是水做的,原料是草药,让我们围绕这些…

删除excel中的最低点,求excel平均值

删除excel中的最低点,求excel平均值

删除,平均值,最低点,电脑软件,excel,excel中的平均成绩是一个普通的操作,使用excel不仅可以找到简单的平均值,而且可以很容易地去掉最高点和最低点。 1。直接平均分 这显然是最容易得到的平均分数直接指定数据。假设需要在B2的平均数据是:B20…

有趣的幽默,有趣的个性签名和个性签

有趣的幽默,有趣的个性签名和个性签

个性签名,有趣,幽默,电脑软件,一个文静端庄的少女走着,长长的头发那么柔软,蓦然回首,哇那么难看! 我让老太太红唇,给你上一课。 你认为我的心是不锈钢防水的吗! 显然,它是大量的试题,但它具有相同的考试范围。它需要学习斜线,并使用冗长的审查,但它仍…

超级感性QQ情感个性签名个性签名

超级感性QQ情感个性签名个性签名

个性签名,感性,情感,电脑软件,QQ,这个超级感性的QQ情感个性签名是一个专门为你安排的小编辑,希望对你有所帮助! 看太多的风景,想太多的东西,剩下的就是伤了的心。 静静的沉默,融化过去的执着。 有一天,也许我们不再记得,曾经有一段时间,有一个我,仔…

WPS文本如何快速添加不可多得的WPS

WPS文本如何快速添加不可多得的WPS

文本,教程,不可多得,快速,电脑软件,本文WPS如何快速添加生僻字小特意为大家整理的,希望对大家有帮助! 1,启动WPS文本2013,然后单击插入符号——其他符号。 2、选择GB2312简体中文(十六),然后找到国王,选择。 3、切换到Unicode(十六米),再到Wang 出现所…

如何实现RGB色彩模式的PS文件和CMY

如何实现RGB色彩模式的PS文件和CMY

文件,模式,互换,色彩,如何实现,如何实现RGB色彩模式的PS文件和CMYK色彩模式文件互换吗印刷的标准模式是CMYK,和标准的CMYK文件一般是印刷的要求,因此如何在PS中RGB文件转化为CMYK文件请看下面的细节。 印刷的标准模式是CMYK,和标准的CMYK文件…