gpt4 book ai didi

javascript - 使用异步瀑布时绑定(bind)回调函数

转载 作者:行者123 更新时间:2023-11-28 04:34:57 25 4
gpt4 key购买 nike

我花了一段时间试图找出一个好的解决方案来从异步瀑布(异步库)函数中抽象出一个函数(以保持我的代码干燥),但我一直收到一条错误消息:cb没有定义。另外,当刚刚通过this时至bind ,函数 async被定义在范围内,并且当传递 cb 时以及。最终,我找到了一个可行的解决方案(将 cb 作为函数添加到 this 对象),但它看起来有点困惑,可能有更好的方法。有什么建议吗?:

// registerController.js
const async = require('async');
const registerService = require('../services/register');

// Api endpoint code
...

// is there a better way than (this.cb = cb)
let callbackHandler = (err, res) => {
if (err) this.cb(err);
this.cb(null, res);
};

// asynchronously perform registration
async.waterfall([
(cb) => {
registerService.createAccount(username, email, callbackHandler.bind(this.cb = cb));
},
(res, cb) => {
registerService.doSomethingElse(domain, callbackHandler.bind(this.cb = cb);
},
....

// registerService.js
module.exports = {

createAccount: (username, email, callback) => {
httpService.request({
host: myHost,
method: 'POST',
path: '/api/signup',
body: {
username,
email
}
}).then((res) => {
return callback(null, res);
}).catch((err) => {
return callback(err);
});
},
...
}

注意:出于单元测试目的和精益 Controller (采用 MVC 方法)将代码重构到服务文件中

最佳答案

你不应该需要任何重构,async已经是抽象的了。只需删除 callbackHandler 并将 cb 直接传递到您的函数中即可:

async.waterfall([
(cb) => {
myService.createAccount(fullName, email, cb);
},
(res, cb) => {
myService.doSomethingElse(domain, cb);
},

], …);
<小时/>

但是,如果您在这里放弃 async.js 并拥抱 Promise,您会得到更简单的代码:

// registerController.js
const registerService = require('../services/register');

// Api endpoint code

registerService.createAccount(username, email)
.then(res =>
registerService.doSomethingElse(domain) // supposed to return a promise as well
)

// registerService.js
exports.createAccount = (username, email) => { // no callback
return httpService.request({
// ^^^^^^ returns the promise
host: myHost,
method: 'POST',
path: '/api/signup',
body: {
username,
email
}
});
};

关于javascript - 使用异步瀑布时绑定(bind)回调函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44290532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com