我必须通过API设置一些内容。重要的是不同的功能在彼此之后执行。所有列出的函数都会给出正确的承诺。
a(analyticsConfig._listConfig)
.then(function() {
return b(listName, analyticsConfig._fieldConfig);
})
.then(function() {
return c(listName)
})
.then(function() {
return d(analyticsConfig._roleConfig);
})
我想使用类似a.then(b(listName, analyticsConfig._fieldConfig))
左右的东西,但你可能知道这不起作用。
还有其他办法吗?
答案 0 :(得分:4)
只有b
返回一个返回promise的函数时才会有效。你总是必须将函数传递给then
作为回调,没有办法解决这个问题。然而,有很多方法可以构建一个。
将部分应用程序(使用bind
或其他),currying等等放在一边,为更好的语法提供最佳选择是ES8 async
/ await
(async function() {
await a(analyticsConfig._listConfig);
await b(listName, analyticsConfig._fieldConfig);
await c(listName);
await d(analyticsConfig._roleConfig);
})();
或ES6箭头功能:
a(analyticsConfig._listConfig)
.then(() => b(listName, analyticsConfig._fieldConfig))
.then(() => c(listName))
.then(() => d(analyticsConfig._roleConfig))
答案 1 :(得分:2)
你可以把它写成
a.then(b.bind(null, listName, analyticsConfig._fieldConfig))
或者,如果您使用babel来转换代码,或者您定位的是节点版本> v4。,你可以做到
a.then(() => b(listName, analyticsConfig._fieldConfig))
答案 2 :(得分:1)
你可以绑定它:
a.then(b.bind(context,listName,analyticsConfig._fieldConfig))
请确保将预期的上下文绑定到它。
根据the docs:
bind()
方法创建一个新函数,在调用时,将其this关键字设置为提供的值,并在调用新函数时提供任何前面提供的给定参数序列。
答案 3 :(得分:-1)
您可以使用async / await执行以下操作:
function a() {
console.log('Getting A...');
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Hello A!');
}, 1000);
});
}
function b() {
console.log('Getting B...');
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Hello B!');
}, 1000);
});
}
function c() {
console.log('Getting C...');
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Hello C!');
}, 1000);
});
}
function d() {
console.log('Getting D...');
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Hello D!');
}, 1000);
});
}
async function getAll() {
await a();
await b();
await c();
await d();
console.log('Done');
}