其实标题的表述是有问题的,我们知道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,想到的一个问题,一开始也不明白,后来经过别人指点,拓展出来的,如有不对之处,请指教。