javascript - promise中调用reject,后面的then方法还会执行?
巴扎黑
巴扎黑 2017-04-11 12:57:51
[JavaScript讨论组]

多个异步操作,如果中间出现reject后面应该不会再执行,
为什么下面代码中第二个then函数还会执行?

function getJson(idx){
    return new Promise(function(resolve,reject){
        setTimeout(function(){
            var random = Math.floor(Math.random() * 1000);
            console.log('success'+random); 
            reject(random);
        },1000)
    })
}


getJson(13).then(function(){
     return getJson(14);
},function(){
    console.log(arguments)
    return "adas";
}).then(function(){
    return  getJson(15);
}).then(function(){
    return  getJson(16);
})
巴扎黑
巴扎黑

全部回复(2)
巴扎黑

then 返回一个由输入函数确定的Promise:

如果 onFulfilled 或者 onRejected 抛出一个错误,或者返回一个拒绝的 Promise ,then 返回一个 >rejected Promise。
如果 onFulfilled 或者 onRejected 返回一个 resolves Promise,或者返回任何其他值,then 返回一个 >resolved Promise。

https://developer.mozilla.org...返回值

第一个then执行onRejected,返回一个resolved Promise,第二个then执行,但是第二个then没有onRejected,所以简单地采用 Promise 的拒绝状态

PHPz

楼上从MDN上给了官方的解释,也是正解。但没有给出为什么要这么设计。我就讲一讲这一点。

核心的原因是无法保证同步或异步的唯一性。要理解这一句话,先看这段代码:

let cached = {};

function getJson(idx) {
    return new Promise(function (resolve, reject) {
        if (cached[idx]) {
            console.log('success' + cached[idx]);
            return resolve(cached[idx]);
        }
        setTimeout(function () {
            var random = Math.floor(Math.random() * 1000);
            cached[idx] = random;
            console.log('success' + random);
            resolve(random);
        }, 1000)
    })
}
console.log('start');
getJson(13);
console.log('end');

当未被缓存的情况下返回的是:

start
end
success556

当有缓存的情况下返回的是:

start
success556
end

问题根源是当有缓存的时候,是以同步的形式执行。

所以对于 getJson 无法保证都是异步或同步的情况下,那么 Promise 在设计时就干脆所有的都以异步来解决这一问题。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号