开发手册 欢迎您!
软件开发者资料库

ES6 - Promises

ES6 Promises - 从基础开始,以先进的理念与实例包括概述,环境,语法,变量,操作符,决策,循环,函数,事件,饼干,页面重定向,对话框,太虚关键字,页面简单,简单的步骤了解ES6印刷,对象,数字,布尔值,字符串,新建字符串的方法,数组,日期,数学,正则表达式,HTML DOM,集合类,承诺,模块,错误处理,验证,动画,多媒体,调试,影像地图,浏览器。

Promises 是一种在JavaScript中实现异步编程的简洁方法(ES6新功能).在承诺之前,Callbacks用于实现异步编程.让我们首先了解异步编程及其实现,使用回调.

了解回调

函数可以作为参数传递给另一个函数.此机制称为回调.回调会对事件有所帮助.

以下示例将帮助我们更好地理解这一概念.

在上面显示的 notifyAll()方法中,通过发送短信和发送电子邮件来进行通知.因此,notifyAll方法的调用者必须传递两个函数作为参数.每个功能都承担一项责任,如发送短信和发送电子邮件.

成功执行上述代码后会显示以下输出.

starting notification process Sms send .. Email send .. End of script

在上面提到的代码中,函数调用是同步的.这意味着UI线程将等待完成整个通知过程.同步调用成为阻塞调用.让我们现在理解非阻塞或异步调用.

了解AsyncCallback

考虑上面的例子.

要启用脚本,请对notifyAll()方法执行异步或非阻塞调用.我们将使用JavaScript的 setTimeout()方法.此方法默认为异步.

setTimeout()方法接受两个参数 :

  • 回调函数.

  • 调用方法的秒数.

在这种情况下,通知进程已用超时包装.因此,代码设置需要两秒钟的延迟.将调用notifyAll()并且主线程继续执行其他方法.因此,通知过程不会阻止主JavaScript线程.

成功执行上述代码后会显示以下输出.

End of script starting notification process Sms send .. Email send ..

如果是多个回调,代码看起来很可怕.

ES6通过引入承诺的概念来帮助您. Promise是"Continuation events",它们可以帮助您以更清晰的代码风格一起执行多个异步操作.

示例

让我们理解这一点一个例子.以下是相同的语法.

var promise = new Promise(function(resolve , reject) {       // do a thing, possibly async , then..     if(/*everthing turned out fine */)    resolve("stuff worked");     else        reject(Error("It broke"));  });  return promise;// Give this to someone

实现承诺的第一步是创建一个使用promise的方法.假设在这个例子中, getSum()方法是异步的,即它的操作不应该阻止其他方法的执行.一旦此操作完成,它将在稍后通知调用者.

以下示例(步骤1)声明Promise对象'var promise'. Promise构造函数首先将函数用于成功完成工作,另一个函数用于发生错误.

promise通过使用resolve回调并传入来返回计算结果结果,即n1 + n2

步骤1 :  resolve(n1 + n2);

如果getSum()遇到错误或意外情况,它将调用Promise中的拒绝回调方法并将错误信息传递给调用者.

第2步 : 拒绝(错误("不支持否定"));

方法实现在以下代码中给出(步骤1).

function getSum(n1, n2) {      varisAnyNegative = function() {         return n1 < 0 || n2 < 0;      }      var promise = new Promise(function(resolve, reject) {         if (isAnyNegative()) {            reject(Error("Negatives not supported"));         }         resolve(n1 + n2)   });      return promise;   }

第二步详细说明了调用者的实现(步骤2).

调用者应该使用'then'方法,它采用两种回调方法 - 首先是成功,第二种是失败.每个方法都有一个参数,如下面的代码所示.

getSum(5, 6)   .then(function (result) {      console.log(result);   },   function (error) {      console.log(error);   });

成功执行上述代码后会显示以下输出.

  11

由于getSum()的返回类型是Promise,我们实际上可以有多个'then'语句.第一个'then'将有一个return语句.

getSum(5, 6)   .then(function(result) {      console.log(result);      returngetSum(10, 20);    // this returns another promise   },   function(error) {      console.log(error);   })   .then(function(result) {      console.log(result);   }, function(error) {      console.log(error);});

成功执行上述代码后会显示以下输出.

  11  30

以下示例使用getSum()方法发出三个then()调用.

成功执行上述代码后会显示以下输出.

程序显示'脚本结束'首先,然后逐个调用getSum()方法得到结果.

End of script  11 30 70

这表示以异步样式或非阻塞样式调用getSum(). Promise为处理回调提供了一种干净利落的方式.