如何创建async.auto-like promises chain?

时间:2016-08-23 03:48:49

标签: javascript promise bluebird

这是我的代码:

async.auto({
    client: service.findClient,
    existingChat: ['client', service.findChat],
    chat: ['client', 'existingChat', service.createChat]
}, (err) => {
    if (err) return service.handleError(err);
    service.emitChatEvent();
    service.editMenu();
});

使用Bluebird Promises处理它的最佳方法是什么?

对我来说最令人困惑的是这一行:

 chat: ['client', 'existingChat', service.createChat]

service.createChat应该可以访问service.findClient()service.findChat()个结果。

2 个答案:

答案 0 :(得分:0)

您可以查看其他已创建的模块,例如async-bluebird,或者您可以自己动手。根据您的问题,您似乎不一定需要自己的auto()承诺实施,只是您的示例的工作版本。在这种情况下,您可以通过使用链接和all()函数的组合来实现它。例如(未经测试且不在我的头顶):

let fc = service.findClient(message);
Promise.all([fc, fc.then(service.findChat)])
       .then(service.createChat);

首先,我从findClient函数创建一个promise,然后为all函数创建一个必需的promise的数组。第一个是初始承诺,而第二个是第一个进入第二个函数的链式版本。当两者都完成后,all函数会将两个promises的结果返回到结果数组中。

答案 1 :(得分:0)

我想我找到了解决方案:

service.findClient(message)
    .then((client) => [client, service.findChat(client)])
    .spread(service.createChat)
    .then(service.emitChatEvent)
    .then(service.editMenu)
    .catch(service.handleError);