promise & generator & async/await

// promise
// 关于回调地狱
/**
 * 回调函数带来的问题:
 * 1. 代码可读性差
 * 2. 回调比较多时,错误捕捉难处理 
 * 3. 控制反转带来的信任问题 -- 在进行异步请求时,用到第三方工具库,回调函数交由第三方库执行,
 * 由第三方库决定何时执行回调函数,执行回调函数次数,第三方工具库是否百分之百可靠,带来的信任问题
 */
// try {
    setTimeout(()=>{
        console.log(1)
        setTimeout(()=>{        
            try {
                console.log(2)
                throw new Error("error")
            } catch (error) {
                console.log(error)
                console.log("continue……")
            }        
            setTimeout(()=>{
                console.log(3)
                setTimeout(()=>{
                    console.log(4)
                },1000)
            },1000)
        },3000)
    },1000)       
// } catch (error) {
//     console.log(error)
//     console.log("continue……")
// }
/**
 * 回调地狱的错误捕获,只能在每个settimeout中进行try catch ,不能在整体外面使用try catch ,整体外面使用try catch ,try catch在主线程中进行,settimeout中抛出的任务在宏任务队列中,因此,整体外面添加try catch 不能捕获到settimeout中的错误
 */

 // Promise
 /**
  * Promise 解决了回调地狱的问题
  * Promise 三种状态 pending resolved rejected ,状态可以从pending转变为resolved或者rejected ,状态一旦改变后就不会再改变,通过then方法来实现链式调用
  * 缺点: 创建之后,立即执行,不能中途取消
  */

/**
 * 1. Promise then为promise状态改变的回调函数 通过then方法来实现链式调用
 */
new Promise((resolve)=>{
    setTimeout(()=>{
        console.log(1)
        resolve()
    },1000)
}).then(()=>{
    return new Promise((resolve)=>{
        setTimeout(()=>{
            console.log(2)
            resolve()
        },1000)
    })
}).then(()=>{
    return new Promise((resolve)=>{
        setTimeout(()=>{
            console.log(3)
            resolve()
        },1000)
    })
})    
// 1 2 3 

/**
 * 2. Promise中的错误捕获: Promise抛出的错误不会被外面的try catch捕获,会被catch捕获
 */
try {
    new Promise((resolve)=>{
        throw new Error("error")
        resolve()
    })
    .catch((reason)=>{
        console.log("catch error", reason) // 捕获
    })
} catch (error) {
    console.log("e", error) // 无法捕获
}
/**
 * Promise中的then中抛出的错误,也是不会被外部的try catch捕获,被.catch捕获,.catch相当于then的rejected状态回调函数的另一种写法
 * 捕获错误最好使用catch 
 * catch也会返回一个新的promise,后面还可以支持继续进行链式调用
 */
try {
    Promise.resolve().then(()=>{
        throw new Error("error")
    })
} catch (error) {
    console.log("e", error) // 捕获捕获
}
Promise.resolve(1)
.then(()=>{
    throw new Error("error")
})
.then(null, (reason)=>{
    console.log("reason", reason) // 捕获
})
.then(()=>{
    return new Promise((resolve)=>{
        setTimeout(()=>{
            console.log("settimeout") // 执行
            resolve()
        })
    })
})
.catch((error)=>{
    console.log("catch", error) // 未捕获到错误
}).then(()=>{
    console.log("continue...") // 执行
})

/**
 * 3. promise解决回调地狱的控制反转的问题:
 * Promise 状态一旦改变之后不能再改变 -- 只能执行一次
 * Promise 状态一旦改变立即执行回调函数 -- 控制回调函数执行的时间
 */

// generator
/**
 * generator:
 * 状态机,函数分段执行
 * function 和 函数名之间 * ; yield执行停止的标志,next开始执行的命令
 * 根据next返回结果 可以查看函数是否执行完
 */
function * gene(){
    console.log(1)
    yield
    console.log(2)
    yield
    console.log(3)
    yield
}
var g = gene()
console.log(g.next()) // value: undefined done: false
console.log(g.next())
console.log(g.next())
console.log(g.next()) // done: true
console.log(g.next()) // done: true

function timer(time){
    return new Promise((resolve)=>{
        setTimeout(()=>{
            console.log(time)
            resolve()
            run.next()
        }, time)
    })
}
// 异步
function *runner(){
    let p1 = yield timer(100)
    let p2 = yield timer(2000)
    let p3 = yield timer(300)
}
var run = runner()
run.next()
// 100 2000 300

// async/await
/**
 * async/await (generator语法糖)
 * async关键字放在函数function 之前, 声明函数为异步函数 ,函数返回Promise
 * await 只在异步函数中起作用,放在基于promise的函数之前,代码停在该处,直到promise执行完成状态改变才执行后面的函数
 * await 后面除了跟promise 还可以跟其他的任意表达式
 */
async function func(){
    await new Promise((resolve)=>{
        setTimeout(()=>{
            console.log(1)
            resolve()
        }, 100)
    })
    await new Promise((resolve)=>{
        setTimeout(()=>{
            console.log(2)
            resolve()
        }, 500)
    })
    await new Promise((resolve)=>{
        setTimeout(()=>{
            console.log(3)
            resolve()
        }, 300)
    })
}
func().then(()=>{
    console.log("continue...")
})
// 1 2 3 continue...

/**
 * 判断执行顺序:
 * async函数中await之前的语句是同步执行的
 * await 后面的语句属于微任务队列
 */
async function async1(){
    console.log('async1 start');
     await async2();
     console.log('async1 end')
 }
 async function async2(){
     console.log('async2')
 }
 console.log('script start');
 async1();
 console.log('script end')
 // 输出: script start => async1 start => async2 => script end => async1 end

 async function func5(){
     console.log(1)
     await Promise.resolve(2)
     console.log(3)
 }
 func5()
 console.log(4)
 // 1 4 3

async function func4(){
    console.log(1)
    await setTimeout(()=>{
        console.log(2)
    },300)
    console.log(3)
}
func4()
setTimeout(()=>{
    console.log(5)
},500)
// 1 3 2 5

/**
 * ⚠️ await 后面的promise返回可能是reject 用try catch来捕获
 */
async function func2(){
    try {
        await Promise.reject(1)
    } catch (error) {
        return error
    }
}
func2()


以下是对提供的参考资料的总结,按照要求结构化多个要点分条输出: 4G/5G无线网络优化与网规案例分析: NSA站点下终端掉4G问题:部分用户反馈NSA终端频繁掉4G,主要因终端主动发起SCGfail导致。分析显示,在信号较好的环境下,终端可能因节能、过热保护等原因主动释放连接。解决方案建议终端侧进行分析处理,尝试关闭节电开关等。 RSSI算法识别天馈遮挡:通过计算RSSI平均值及差值识别天馈遮挡,差值大于3dB则认定有遮挡。不同设备分组规则不同,如64T和32T。此方法可有效帮助现场人员识别因环境变化引起的网络问题。 5G 160M组网小区CA不生效:某5G站点开启100M+60M CA功能后,测试发现UE无法正常使用CA功能。问题原因在于CA频点集标识配置错误,修正后测试正常。 5G网络优化与策略: CCE映射方式优化:针对诺基亚站点覆盖农村区域,通过优化CCE资源映射方式(交织、非交织),提升RRC连接建立成功率和无线接通率。非交织方式相比交织方式有显著提升。 5G AAU两扇区组网:与三扇区组网相比,AAU两扇区组网在RSRP、SINR、下载速率和上传速率上表现不同,需根据具体场景选择适合的组网方式。 5G语音解决方案:包括沿用4G语音解决方案、EPS Fallback方案和VoNR方案。不同方案适用于不同的5G组网策略,如NSA和SA,并影响语音连续性和网络覆盖。 4G网络优化与资源利用: 4G室分设备利旧:面对4G网络投资压减与资源需求矛盾,提出利旧多维度调优策略,包括资源整合、统筹调配既有资源,以满足新增需求和提质增效。 宏站RRU设备1托N射灯:针对5G深度覆盖需求,研究使用宏站AAU结合1托N射灯方案,快速便捷地开通5G站点,提升深度覆盖能力。 基站与流程管理: 爱立信LTE基站邻区添加流程:未提供具体内容,但通常涉及邻区规划、参数配置、测试验证等步骤,以确保基站间顺畅切换和覆盖连续性。 网络规划与策略: 新高铁跨海大桥覆盖方案试点:虽未提供详细内容,但可推测涉及高铁跨海大桥区域的4G/5G网络覆盖规划,需考虑信号穿透、移动性管理、网络容量等因素。 总结: 提供的参考资料涵盖了4G/5G无线网络优化、网规案例分析、网络优化策略、资源利用、基站管理等多个方面。 通过具体案例分析,展示了无线网络优化中的常见问题及解决方案,如NSA终端掉4G、RSSI识别天馈遮挡、CA不生效等。 强调了5G网络优化与策略的重要性,包括CCE映射方式优化、5G语音解决方案、AAU扇区组网选择等。 提出了4G网络优化与资源利用的策略,如室分设备利旧、宏站RRU设备1托N射灯等。 基站与流程管理方面,提到了爱立信LTE基站邻区添加流程,但未给出具体细节。 新高铁跨海大桥覆盖方案试点展示了特殊场景下的网络规划需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值