1 回答
TA贡献1934条经验 获得超2个赞
首先,从简单的 Promise 理解开始。先别扯 Promise 嵌套的问题。因为最朴素的 Promise 概念你就弄错了。
var p = new Promise(function(resolve, reject) {
resolve(1);
});
var cb = function(data) {
console.log(data);
};
p.then(cb); // cb函数 和 上面的 resolve 不是一个东西!不是!
看起来 Promise 里的 resolve 方法就像是 then 方法传递过来的这个回掉函数?当然不是!resolve 是指用一个值来 完成 这个 promise,只有 promise resolve了,then方法注册的回掉才会被执行。同理,即使没人关心你这个 promise 是否会被 resolve,没有人用 then 注册回掉函数,resolve 照样可以正常执行。
为什么p2后跟的then针对的是p1而不是p2本身呢?
为什么?标准就是这样规定的啊!
标准规定,如果你用普通对象来 resolve 一个 promise,这个promise就立马拿着这个值然后变成 resolved 状态,如果你用一个 thenable 的对象,就是一个promise对象 来 resolve 另一个 promise,这个 promise 就会自动关联起来!
var p1 = new Promise(function(resolve) {
setTimeout(function(){
resolve(1);
}, 1000);
});
var p2 = new Promise(function(resolve, reject) {
resolve(p1);
// 等价于
p1.then(resolve).catch(reject);
});
// 标准就是这样规定的,这才是 promise 的价值所在,否则和普通的callback有什么区别?
要在 p2.then 里拿到 p1 ?
那你别用一个 promise 对象作为值来 resolve p2 啊!
话说你又是为什么要在 then 里拿到 p1呢?拿到p1你又能干什么的?还不是调用.then 么?
话说你又是为什么要在 then 里拿到 p1呢?拿到p1你又能干什么的?还不是调用.then 么?
话说你又是为什么要在 then 里拿到 p1呢?拿到p1你又能干什么的?还不是调用.then 么?
不存在这种需求的,没道理要这样作,如果要,那你这样啊:
resolve([p1])
p2.then(([p1]) => {
// p1
})
添加回答
举报