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

发布于 2022-09-11 17:08:15 字数 466 浏览 16 评论 0

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是正确的吗?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

﹂绝世的画 2022-09-18 17:08:15

顺序是没问题只不过 setTimeout是宏任务 其他都是微任务具体原理可参考:https://segmentfault.com/a/11...

儭儭莪哋寶赑 2022-09-18 17:08:15

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

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

风铃鹿 2022-09-18 17:08:15

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

function a() {
    return pro().then(res => {
        return new Promise((reslove) => {
            setTimeout(() => {
                console.log(1)
                reslove();
            }, 2000)
        })
    })
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文