JavaScript异步编程Promise模式的6个特性分享


在我们开始正式介绍之前,我们想看看Javascript Promise的样子:

代码如下:
var p = new Promise(function(resolve, reject) {
  resolve(“hello world”);
});

p.then(function(str) {
  alert(str);
});

1. then()返回一个Forked Promise

以下两段代码有什么区别呢?

代码如下:
// Exhibit A
var p = new Promise(/*…*/);
p.then(func1);
p.then(func2);

// Exhibit B
var p = new Promise(/*…*/);
p.then(func1)
.then(func2);

如果你认真以上两段代码等同的话,那么Promises只不过是一个一维的回调函数数组。然而,其实不是这样的。每一个then()调用都返回一个forked promise。因此,ExhibitA中,如果func1()抛出一个异常,func2()仍旧正常调用。

在ExhibitB中,如果func1()抛出一个错误,fun2()将不会被调用,因为第一个调用返回了一个新的promise,这个在func1()中会被拒绝。结果是func2()被跳过。

总结:promises可以被fork成多个路径,类似复杂的流程图。

2. Callback应该传递结果

当你运行下面代码的时候什么会得到警告提示呢?

代码如下:
var p = new Promise(function(resolve, reject) {
  resolve(“hello world”);
});

p.then(function(str) {})
.then(function(str) {
  alert(str);
});

第二个then()中的alert没有显示任何内容。这是因为回调函数,在promise的上下文中,因为结果的变化并没有回调函数。promise期望你的回调函数返回同样的结果或者返回一个替换结果,然后被传递到下一个回调函数中。

类似使用adpater来变化结果,如下:

代码如下:
var feetToMetres = function(ft) { return ft*12*0.0254 };

var p = new Promise(/*…*/);

p.then(feetToMetres)
.then(function(metres) {
  alert(metres);
});

3. 只有来自上一层的异常可以被捕捉

这两段代码有什么区别?

代码如下:
// Exhibit A
new Promise(function(resolve, reject) {
  resolve(“hello world”);
})
.then(
  function(str) {
    throw new Error(“uh oh”);
  },
  undefined
)
.then(
  undefined,
  function(error) {
    alert(error);
  }
);
 

// Exhibit B
new Promise(function(resolve, reject) {
  resolve(“hello world”);
})
.then(
  function(str) {
    throw new Error(“uh oh”);
  },
  function(error) {
    alert(error);
  }
);

  • —-想了解更多的linux相关异常处理怎么解决关注<计算机技术网(www.ctvol.com)!!>

    本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

    ctvol管理联系方式QQ:251552304

    本文章地址:https://www.ctvol.com/jspttutorial/69261.html

    (0)
    上一篇 2020年4月20日
    下一篇 2020年4月20日

    精彩推荐