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);
})
巴扎黑
巴扎黑

全部回复(1)
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 在设计时就干脆所有的都以异步来解决这一问题。

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

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