JS承诺:控制流程

时间:2017-03-09 14:20:22

标签: javascript promise chaining

我必须通过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))左右的东西,但你可能知道这不起作用。

还有其他办法吗?

4 个答案:

答案 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');
}