将一个函数(可能同步,可能异步)包装成Promise

        其实标题的表述是有问题的,我们知道Promise就是一个异步语法糖。只有在实际使用函数的时候使用Promise语法糖,Promise并不能包装函数,不能像函数一样调用。

        标题的意思是在函数执行之后执行我希望执行的代码。

        先来看看简单的同步的情况。有一个函数a,函数a有参数,有返回值。函数a执行之后,我希望执行函数b。其实很简单,通过Promise,将函数a,b“连接”起来即可。

function a(str){
    console.log(`我是函数a,参数:${str}`);
    return 'aaa'
}
function b(str){
    console.log(`我是函数b,参数:${str}`);
    return 'bbb'
}
let promise = new Promise((resolve,reject)=>{
    let a_result = a('a');
    resolve(a_result);
})

promise.then(v=>{
    b(v);
})

         从上面的代码中我们也看出来了,Promise内部已经是实际调用函数a了,我们并不能包装函数a成为一个promise,然后调用。在new Promise的时候,已经开始执行函数a.

        再看看异步的情况。

        异步函数,想拿到结果,肯定有回调函数。两种写法,一种参数传入回调函数,

//模拟睡眠https://www.cnblogs.com/qianxiaox/p/13685279.html
const sleep = (delay) => new Promise((resolve) => setTimeout(resolve, delay))

async function a(str,fun){
    console.log(`我是函数a,参数:${str}`);
    await sleep(1000)//模拟耗时操作
    console.log(`函数a处理完成`);
        fun('aaa'); 
 
}

function b(str){
    console.log(`我是函数b,str:${str}`);
}

a('123',b);

        一种函数内部直接调用固定的回调函数。

//模拟睡眠https://www.cnblogs.com/qianxiaox/p/13685279.html
const sleep = (delay) => new Promise((resolve) => setTimeout(resolve, delay))

async function a(str,fun){
    console.log(`我是函数a,参数:${str}`);
    await sleep(1000);模拟耗时操作
        b('aaa');//setTimeout模拟异步操作,调用回调函数

}
function b(str){
    console.log(`我是函数b,str:${str}`);
}

        不管是哪种方式,在异步函数a执行的一刻,已经确定了回调函数是谁。根据上面同步函数的例子,我们知道,new Promise时,已经开始执行内部代码。也就是new Promise时,回调函数就已经确定。这就和我们希望用promise的方式“连接”回调函数相悖。就必须修改函数a.
        想想也是,函数a是一个异步函数,我们想改造成Promise的方式,肯定是要修改函数a的。一开始都说了Promise不是包装函数。
改造起来也很简单,异步函数内部直接返回结果,Promise内部判断执行成功还是失败。

//模拟睡眠https://www.cnblogs.com/qianxiaox/p/13685279.html
const sleep = (delay) => new Promise((resolve) => setTimeout(resolve, delay))

function b(str){
    console.log(`我是函数b,str:${str}`);
}

async function  a2(str){
    console.log(`我是函数a,参数:${str}`);
    await sleep(1000)
    console.log(`函数a执行完成`);
    return 'aaa';
  
}
let promise = new Promise((resolve,reject)=>{
    let a_result = a2('a');//这里实际上需要根据a_result判断异步函数a2是执行成功还是失败,再调用resolve或是reject。我们这里主要关注连接两个函数,所以简写了。
    resolve(a_result);
})
promise.then(v=>{
b(v);
})

        刚学Promise,想到的一个问题,一开始也不明白,后来经过别人指点,拓展出来的,如有不对之处,请指教。 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值