我尝试将代码转换为使用回调到Promise,但我从Promise(蓝鸟)获得了一些奇怪的行为
这是主要的逻辑
function func1(callback) {
func2()
.then(function(resultFromFunc2) {
if (resultFromFunc2 === true) {
callback(null, resultFromFunc2)
} else {
return func3()
}
})
.then(function(resultFromFunc3) {
console.log('Func 3', resultFromFunc3)
callback(null, resultFromFunc3)
})
.catch(function(err) {
console.log('error', err)
})
}
func1(function(err, result) {
console.log('func1', err, result);
})
并且func2
和func3
只是一个简单的解决方案
function func2() {
return new Promise((resolve, reject) => {
resolve(true)
});
}
function func3() {
return new Promise((resolve, reject) => {
resolve(true)
});
}
如果func2
解析true
代码应该在第一个代码中停止运行,那么我会发现第二个代码被调用
这是终端的结果。
func1 null true
Func 3 undefined
func1 null undefined
如果func2
已解决true
答案 0 :(得分:1)
@Phattahana, 只是在你的问题上发表我的想法。
正如你在答案中所说的那样,你不应该从第一天开始致电callback()
。或者您应该准备好更改工作流程并删除2nd then
。有很多可能性。
在特定场景中,您希望代码的执行方式与您发布的问题相同(即;如果if condition
为真,则不要再调用第二个 - 场景),您可以使用下面的代码
var Promise = require("bluebird");
function func1(callback) {
func2()
.then((resultFromFunc2) => {
return new Promise((resolve, reject) => {
if (resultFromFunc2 === true) {
callback(null, resultFromFunc2);
} else {
resolve(func3());
}
});
}).then((resultFromFunc3) => {
console.log('Func 3', resultFromFunc3)
callback(null, resultFromFunc3)
}).catch((err) => {
console.log('error', err)
});
}
func1((err, result) => {
console.log('func1', err, result);
return 1;
});
function func2() {
return new Promise((resolve, reject) => {
resolve(false)
});
}
function func3() {
return new Promise((resolve, reject) => {
resolve(true)
});
}
1st then
中的代码应该成为一个单独的promise解析函数,并且只有在不满足条件时才应解析它。
希望清楚。
谢谢,
答案 1 :(得分:0)
问题出在第二个then
部分。如果你删除它,一切都应该按预期工作(如果我理解正确)。请参阅下面的代码段 - 如果您更改func2
以解决(false),则会调用func3
,否则将调用回调。
function func1(callback) {
func2()
.then(function(resultFromFunc2) {
if (resultFromFunc2 === true) {
callback(null, resultFromFunc2)
} else {
return func3()
}
})
.catch(function(err) {
console.log('error', err)
})
}
func1(function(err, result) {
console.log('func1', err, result);
})
function func2() {
return new Promise((resolve, reject) => {
console.log('func2');
resolve(true)
});
}
function func3() {
return new Promise((resolve, reject) => {
console.log('func3')
resolve(true)
});
}

答案 2 :(得分:0)
我刚刚找到解决方案,
function func1(callback) {
func2()
.then(function(resultFromFunc2) {
if (resultFromFunc2 === true) {
return 'result from func2'
} else {
return func3()
}
})
.then(function(result) {
callback(null, result)
})
.catch(function(err) {
console.log('error', err)
})
}
我不应该在第一次回调,因为从第一次回来然后它发送到第二次。
我想念Promise的行为。首先,如果第一个没有返回Promise,我认为它不会调用第二个。