我目前正在开发一个将集成到用户自己的网络服务器中的 API/路由器。我的代码将完成其所需的工作,但也允许用户在之后实现他们自己的逻辑,例如在这个片段中:myApi.on('action', (err, result, req, res) => {/*user's这里的逻辑*/})
。
根据设计,如果用户决定覆盖默认行为并实现他们自己的逻辑,我的代码将不会结束响应。这是为了允许请求和响应在用户需要的情况下进入下一个中间件功能。
我想要的控制流程是:
运行我的初始路由逻辑
运行用户的自定义逻辑
如果响应还没有结束,将控制权交给下一个中间件函数
当用户想要实现任何异步逻辑时,我的问题就出现了。在将控制权传递给下一个中间件功能之前,我无法让用户的自定义逻辑结束。我相信这是因为我设置的界面。我希望用户执行的工作尽可能少。这意味着我不希望向用户传递一些等效于 callback()
或 next()
函数的东西,他们需要在逻辑的每个端点调用这些函数(就像我的路由器涉及许多不同的路由)。
我研究了诸如 promisify-node 之类的 promise 包装器,但它们似乎只能包装将回调作为最终参数的函数。我还考虑过要求用户从他们的自定义实现中返回 promise ,但这违背了我不需要繁忙工作/样板代码的愿望。
有没有什么方法可以使用 promises 或任何其他构造来处理这个异步问题而不会让用户感到痛苦?
最佳答案
不,你不能 promise 一个不接受回调的函数。这样的函数要么不是异步的,要么无法让您知道它何时完成 - 您真倒霉。
My issue arises when the user wants to implement any async logic.
如果用户想实现一些异步的东西,只需要用户传递一个返回 promise 的函数。无论如何,他都必须使用 promises 可能会对他有好处 :-)
const myApi = {
on(name, fn) {
Promise.resolve(result) // or whenever you need to run the user logic
.then(result =>
fn(req, result) // or whatever you want to pass
)
.then(customresult => {
res.write(customresult); // or whatever you want to do with its result
});
}
};
myApi.on('action', (req, result) => {
// user's logic here
// throw exceptions
// return values
// return promises for values
// or whatever the user needs to do
})
关于javascript - 如何 promise 一个不包含回调参数的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39626653/