我在编写一些库的时候,假设callback是暴露给用户的接口,由外部传递进来,组件与用户交互多次触发这个回调,并且需要根据回调结果执行后续结果:

let ret = callback()
if(ret instanceof Promise){
    ret.then(resp=>balabala(resp))
}else{
    balabala(resp)
}

这是我长时间编写写强类型语言带来的影响,虽然可以运行,但是非常的啰嗦,使用Promise.resolve()可以完成上面的逻辑:

Promise.resolve(callback()).then(resp=>balabala(resp))

如果callback返回的是一个非Promise对象,经过Promise.resolve封装一次变成Promise对象,如果已经是Promise对象了,那么直接返回。

Promise.resolve(Promise.resolve(Promise.resolve(1))).then(v=>console.log(v))
// 运行结果:1

对于多个 Promise 需要等待全部完成,可以使用Promise.all()Promise.all()接收一个可迭代对象,并且等待其中的所有 Promise 完成才执行下一步的操作,其中只要有一个对象返回的结果是reject,那么Promise.all()也会返回reject结果,这个过程是并行的,前后任务不会相互阻塞。如果需要顺序运行,可以使用reduce,下面代码会顺序执行每个任务,会在 4s 后输出结果:

const job1 = () => new Promise(resolve => setTimeout(resolve, 3000));
const job2 = () => new Promise(resolve => setTimeout(resolve, 1000));
[job1, job2]
    .reduce((p, job) => p.then(job),Promise.resolve())
    .then(()=>console.log("done"));