我没有在JS中正确使用promises。
我有3个异步的相互依赖的函数,如下所示:
func1,func2和func 3。
所以func3必须等待func1和2,而func2必须只等待func1。
这是我能够编写的JS小提琴并且它可以工作,但是阅读3在一起使用的混乱只是一个小问题。什么是执行这种连锁经营的正确方法?
function func1() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve(10);
}, 1000);
});
}
function func2(return1) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve(return1 + 20);
}, 1000);
});
}
function func3(val1, val2) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve(val1 + val2);
}, 1000);
});
}
func1().then(function(result) {
func2(result).then(function(result2) {
func3(result, result2).then(function(finalResult) {
console.log(finalResult);
}, function(err) {
console.log(err);
});
});
}).catch(function(err) {
console.log(err);
});
答案 0 :(得分:4)
只使用promises,你可以使用闭包范围并嵌套你的promises(这就是你正在做的事情),或者你可以将多个结果作为一个对象传递:
func1()
.then((result) => {
return func2(result).then((result2) => ({result, result2}));
})
.then(({result, result2}) => {
return func3(result, result2);
});
或者您可以将结果存储在所有承诺之外的范围内:
let result;
func1()
.then((_result) => {
result = _result;
return func2(result);
})
.then((result2) => {
return func3(result, result2);
});
如果您的环境支持async/await functions,您可以像这样重写:
async function fn() {
const result = await func1();
const result2 = await func2(result);
const result3 = await func3(result, result2);
return result3;
}
fn().then((result3) => console.log(result3));
如果您的环境支持生成器,您可以使用co库来创建协同例程:
const fn = co.wrap(function*() {
const result = yield func1();
const result2 = yield func2(result);
const result3 = yield func3(result, result2);
return result3;
});
fn().then((result3) => console.log(result3));
答案 1 :(得分:0)
then
回调中返回的值本身是可以的。换句话说,您可以通过从前一个then
回调中返回下一个函数来按顺序处理您的承诺。
而不是
func1().then(function(result) {
func2(result).then(function(result2) {
func3(result, result2).then(function(finalResult) {
console.log(finalResult);
}, function(err) {
console.log(err);
});
});
}).catch(function(err) {
console.log(err);
});

试试这个:
func1()
.then(result => func2(result))
.then(result => func3(result))
.then(result => console.log('Final result', result))
.catch(err => console.error(err))

我将您的功能转换为箭头功能以进行更多清理,但功能上它与您的功能相同。