promise then回调生成promise和回调手动返回promise有什么区别?

clipboard.png

clipboard.png

  • 这幅图如果我在then回调手动返回promise对象,那么下面的then就不自动生成一个新的promise对象么?

clipboard.png

  • 这个该怎么理解

3个promise对象,第一个是getJson产生的我理解,后面两个由then产生就不理解了,有大佬讲讲?

阅读 4.6k
1 个回答

这个没有任何区别啊

const p1=new Promise(function(resolve,reject){
    setTimeout(()=>reject(new Error('fail')),3000);
});
const p2=new Promise(function(resolve,reject){
    //setTimeout(()=>resolve(p1),1000);
    resolve(p1);
});

p2.then(result=>console.log(result))
.catch(error=>console.log(error));

console.log("p2===p1 =>"+(p2===p1));

p2和p1是2个不同的promise

getJSON('/post/1.json').then(function(post){
    return getJSON(post.commentURL);
}).then(function(comments){
    //some code
}).catch(function(error){
    //
});

==>

var getJSONPromise0=getJSON('/post/1.json');

var getJSONPromise1=getJSONPromise0.then(function(post){
    return getJSON(post.commentURL);
});
var getJSONPromise2=getJSONPromise1.then(function(comments){
    //some code
});

var getJSONPromise3=getJSONPromise2.catch(function(error){
    //
    console.log(error);
});

一共是4个promise

=====补充回答====
我们看看Promise
new Promise( /* executor */ function(resolve, reject) { ... } );
这个是Prmoise的构造函数

Promise.prototype.then(onFulfilled, onRejected)是then方法的原型定义。

Appends fulfillment and rejection handlers to the promise, and returns a new promise resolving to the return value of the called handler, or to its original settled value if the promise was not handled (i.e. if the relevant handler onFulfilled or onRejected is not a function).

then方法返回一个新的promise对象,并把onFulfilled和onRejected作为新的Promise对象的完成或拒绝结果回调函数。
如果没有对应的回调函数,那么将对应的值直接作为新的Promise的resolve值

你要问的是onFulfilled函数有返回非promise,返回promise或不返回值之间的区别吧:
返回非promise,那么这个值通过Promise.resolve静态方法转成一个状态确定的Promise返回
返回promise,那么这个新的promise将被返回作为作为后续then/catch方法的的实际调用Promise
不返回,也是返回一个一个状态确定的Promise,最终的决议值为undefined

你可以简单的认为返回Promise就会把then方法返回的Promise代替了

测试代码

var tempP;
var p1=new Promise(function(resolve,reject){
    setTimeout(function(){
        resolve("p1");
    },1000);
});

var p2=p1.then(function(data){
    console.log("p2 GOT:"+data);
    //[A]
    /*
    tempP=new Promise(function(resolve,reject){
        setTimeout(function(){
            resolve("return_Promise");
        },1000);
    });
    */
    
    tempP="return_Normal"//[B]
    //return tempP; //[C]
},function(error){
    console.log("error:"+error);
});

var p3=p2.then(function(data){
    console.log("p3 GOT:"+data);
});

[A]结果
//p2 GOT:p1
//p3 GOT:return_Promise

[B]结果
//p2 GOT:p1
//p3 GOT:return_Normal

[C]结果
//p2 GOT:p1
//p3 GOT:undefined
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题