美文网首页
2019-04-02 Promise 的小技巧和误区

2019-04-02 Promise 的小技巧和误区

作者: KingAmo | 来源:发表于2019-04-02 16:07 被阅读0次
let rt = new Promise((resolve, reject)  => {
  console.log('start!');
  resolve('成功!');
  console.log('fine!')
  reject('失败!');
});

rt.then(v => {
  console.log(v);
}) .catch(err => {
  console.log(err)
});

console.log('Hi!');

// start!
// fine!
// Hi!
// 成功!
  • Promise 构造函数 接受一个函数作为参数,该函数的两个参数分别是resolve和reject,它们是两个函数,由 JavaScript 引擎提供,不用自己部署。

  • Promise 一旦新建它就会立即执行,无法中途取消。

  • 一旦状态改变,就不会再变,任何时候都可以得到这个结果。

所以,上例中, rt 是一个 Promise 对象,resolve 之后,再调用 reject 是无效的,所以 rt 的状态是 resolved

  • 调用resolve或reject并不会终结 Promise 的参数函数的执行(所以会打印fine!)。

  • 上面代码中,Promise 新建后立即执行,所以首先输出的是start!。然后输出fine!,然后输出Hi!

  • 而then方法指定的回调函数,将在当前脚本所有同步任务执行完才会执行,所以成功!最后输出。

  • then \ catch 方法调用后,都返回了一个新的promise对象,所以可以链式调用很多个then函数。

  • resolve 时可以添加参数,参数会被传递到then函数作为参数

  • reject 时可以添加参数,参数会被传递到catch函数作为参数

Promise 中需要 return 吗?

上例可以看出,尽管我们无法改变一个已经改变过状态的Promise,但是reject和resolve都无法让函数剩下的部分终止执行,那函数中 resolve 或者 reject 之后的部分的代码可能会对我们造成干扰。

所以我们最好在 resolve 或者 reject 之后立即停止执行。

resolve('成功!');
return;

或者省一行代码:

return resolve('成功');

那如果是这样呢?

resolve('成功!');
return '失败!';

这个Promise的then 函数的参数仍然是 成功!,也就是说 return 的值没有任何用。

// 1: 对同一个promise对象同时调用 `then` 方法
var aPromise = new Promise(function (resolve) {
    resolve(100);
});
aPromise.then(function (value) {
    return value * 2;
});
aPromise.then(function (value) {
    return value * 2;
});
aPromise.then(function (value) {
    console.log(value); //  100
})

// vs

// 2: 对 `then` 进行 promise chain 方式进行调用
var bPromise = new Promise(function (resolve) {
    resolve(100);
});
bPromise.then(function (value) {
    return value * 2;
}).then(function (value) {
    return value * 2;
}).then(function (value) {
    console.log( value); //400
});

第1种写法中并没有使用promise的方法链方式,这在Promise中是应该极力避免的写法。这种写法中的 then 调用几乎是在同时开始执行的,而且传给每个 then 方法的 value 值都是 100 。

第2中写法则采用了方法链的方式将多个 then 方法调用串连在了一起,各函数也会严格按照 resolve → then → then → then 的顺序执行,并且传给每个 then 方法的 value 的值都是前一个promise对象通过 return 返回的值。

也就是说,第一个 then 函数的参数是resolve 传过来的,后面的 then 函数的参数,是前面的then 函数 return 的值


new Promise(() => {console.log(1)}).then(() => {console.log(2)})

这里永远不会打印 2 , promise 的状态永远是 pending 不会改变,所以不会执行 then里的回调函数

相关文章

网友评论

      本文标题:2019-04-02 Promise 的小技巧和误区

      本文链接:https://www.haomeiwen.com/subject/tddgbqtx.html