promise求解

瘦子
  • 317

刚学廖学峰老师的es6教程,看到promise一段代码:

var p1 = new Promise(function (resolve, reject) {
    setTimeout(resolve, 500, 'P1');
});
var p2 = new Promise(function (resolve, reject) {
    setTimeout(resolve, 600, 'P2');
});
// 同时执行p1和p2,并在它们都完成后执行then:
Promise.all([p1, p2]).then(function (results) {
    console.log(results); // 获得一个Array: ['P1', 'P2']
});

有两个疑问:1.为什么最后的到的是一个数组?2.为什么可以这样写“setTimeout(resolve, 500, 'P1');”?

回复
阅读 1.1k
6 个回答
✓ 已被采纳

1.看看promise.all https://developer.mozilla.org...

主要是等p1跟p2 resolve了才返回(或者报错),那么results应该是p1跟p2里的执行结果,作为数组也很合理吧

2.settimeout 可以接受第三个参数甚至……
https://developer.mozilla.org...

其将作为回调函数的参数传递进去,也就是打个比方

setTimeout(resolve, 500, 'P1');

等回调的时候,就执行resolve('P1');

setTimeout(resolve, 500, 'P1');

第三个参数'p1'就是resolve的参数。
Promise.all把两个resolve传来的数据合成了一个数组。

  1. all方法返回的最后就是一个数组,是其中每个promise的返回值,也就是resolve回来的参数。
  2. setTimeout(resolve, 500, 'P1')并没有什么问题吖。只要resolve在promise内进行调用就可以完成。或是说你是指的是setTimeout的第三个参数?第三个及以后的参数最终是传递到第一个参数(function)中的。

首先setTimeout的第三个参数是可选的,传给执行函数的其他参数,也就是说这个参数是传给resolve的参数,
Promise.resolve(value)

其次,Promise.all(iterable)方法指当所有在可迭代参数中的 promises 已完成,或者第一个传递的 promise(指 reject)失败时,返回 promise

iterable:一个可迭代对象,比如Array

setTimeout有三种原型:

setTimeout(function[, delay, param1, param2, ...]);
// param1~paramN ...  这个几个参数是定时器到时调用函数时候传递给函数的参数。

setTimeout(function[, delay]);

setTimeout(code[, delay]); 
// code 是字符串类型,相当于要再调用 eval 所以不建议使用这个

所以第一个setTimeout(resolve, 500, 'P1');相当于 500ms 之后调用resolve('P1').

Promise.all 不是执行完前两个,而是前两个都执行成功之后(调用resolve把成功的结果传递给后面的函数)才会执行then
传递给后面函数的参数就是前两个执行成功之后的结果,当然要放到数组里呀。

1: Promise.all 方法的参数 [p1, p2] 是数组, results 里面的是 p1, p2 resolve 或者 reject 的值.
2: setTimeout 语法.

你知道吗?

宣传栏