用Promise封装了一个方法A,然后另一个方法B去调用这个封装的A方法,那么B方法怎么返回一个Promise对象?

新手上路,请多包涵
function pro(){
    return new Promise(resolve=>{
        resolve()
    })
}

function a(){
    return pro().then(res=>{
        setTimeout(()=>{
           console.log(1)
        },2000)
    })
}

function b(){
    return pro().then(res=>{
        console.log(2)
    })
}

function c(){
    return pro().then(res=>{
        console.log(3)
    })
}

a().then(b).then(c);

//2 3 1

最后的结果为什么不是1 2 3?
这样返回Promise是正确的吗?

阅读 3.2k
3 个回答

因为你a方法只是创建了一个定时器,并不代表这个定时器回调执行了。

function a() {
    return pro().then(res => {
        return new Promise((reslove) => {
            setTimeout(() => {
                console.log(1)
                reslove();
            }, 2000)
        })
    })
}

从语法上来说没啥错,但我觉得你想表达的应该是:

function pro() {
    return new Promise(resolve => {
        resolve()
    })
}

function a() {
    return pro().then(res => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                console.log(1); 
                resolve()
            },
            2000)
        })
    })
}

function b() {
    return pro().then(res => {
        console.log(2)
    })
}

function c() {
    return pro().then(res => {
        console.log(3)
    })
}

a().then(b).then(c);

你的代码,a立即返回了一个resolved的promise,所以直接走了b,并没有等待。要按顺序输出,必须在setTimeout中resolve

推荐问题
宣传栏