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)
之后不去执行后面的代码,直接返回?
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 嗯,没写清楚。