promise的then链儿中resolve之后,如何跳过后续的then直接返回?
发布于 6 年前 作者 gyj1278 5209 次浏览 来自 问答
function doSomething() {
    return new Promise((resolve, reject) => {
        var obj = {
            boolean: true,
            action: 'codeing'
        }
        console.log('-------------doSomething-------------')
        resolve(obj)
    })
}

function doSomethingElse() {
    return new Promise((resolve, reject) => {
        var obj = {
            action: 'watching'
        }
        console.log('-----------------doSomethingElse-----------------')
        resolve(obj)
    })
}

function test() {
    return new Promise((resolve, reject) => {
        doSomething()
            .then((obj1) => {
                if (obj1.boolean) {
                    console.log(obj1)
                    return resolve(obj1)
                }
                return doSomethingElse()
            })
            .then((obj2) => {
                console.log(obj2.action)
                resolve(obj2)
            })
            .catch((err) => {
                console.log(err)
                reject(err)
            })
    })
}
test()
    .then((result) => {
        console.log(result)
    })
    .catch((err) => {
        console.log('-----------------catch error-------------------')
        console.log(err)
    })

如上面这段代码所示,在return resolve(obj1)之后,仍然会执行后续的then,但是obj2的值为undefined,catch到错误之后,reject(err)似乎没有起到作用。 如何在return resolve(obj1)之后不去执行后面的代码,直接返回?

14 回复
function doSomething () {
  return new Promise((resolve, reject) => {
    var obj = {
      boolean: true,
      action: 'codeing'
    }
    console.log('-------------doSomething-------------')
    resolve(obj)
  })
}

function doSomethingElse () {
  return new Promise((resolve, reject) => {
    var obj = {
      action: 'watching'
    }
    console.log('-----------------doSomethingElse-----------------')
    resolve(obj)
  })
}

function test () {
  return doSomething()
    .then(obj1 => {
      if (obj1.boolean) {
        return obj1
      }
      return doSomethingElse()
    })
}

test()
  .then(console.log)
  .catch(console.error)

@zhuweiyou 这样不行,少了return doSomethingElse()后面的.then()的逻辑,如果上面那个判断为错的话,还要走这段then逻辑的。

后面的拆成子链就好了

可以考虑看看 async / await

@ekoneko 现在用的node版本比较低不支持async/await,

@i5ting 这种办法也可以,不过得嵌套一层promise,

By Design,Promise 就是一路执行下去的,只有 2 条分支的。不要乱套,会死的很惨的,不小心就泄露了。

then设计上是用来链式顺序执行啊。你要想在then里面执行resolve()跳过后面的then, 那要么用async/await, 要么上rxjs

@waitingsong 但是在then中也有可能出现分支的场景啊,promise有解决这种情况的方法吗?

@atian25 怎么就泄露了?

@gyj1278 你要的是不是这个意思

function test() {
    return new Promise((resolve, reject) => {
        doSomething()
            .then((obj1) => {
                if (obj1.boolean) {
                    console.log(obj1)
                    resolve(obj1)
                }else{
                    return doSomethingElse().then((obj2) => {
                        console.log(obj2.action)
                        resolve(obj2)
                    })
                }
            }).catch((err) => {
                console.log(err)
                reject(err)
            });

    })
}

@gyj1278 从你贴的代码来讲,那个 then 什么都没干。所以我以为你并不需要做其他事情。

@soda-wy 是这个意思,我现在的做法就是这种,不过这样嵌套了一层.then(),这个貌似不符合链式写法,

@zhuweiyou 嗯,没写清楚。

回到顶部