解决节点中非阻塞函数调用中的依赖关系
Solve dependency in non blocking function call in nodes
在nodejs中,许多函数调用都是作为非阻塞函数实现的。有时,这些函数调用之间可能存在依赖关系。例如,当用户登录时,我想首先获得用户的用户类型,然后根据用户类型,我可以获得刚刚分配给该用户类型的任务。在非阻塞函数中,我使用嵌套函数调用:
$http.post(url_login, login_request)
.success(function(req) {
$http.post(url_get_tasks, req.type)
.success(function(req) {
//update tasks
})
})
许多库只提供非阻塞函数,例如node_redis库。有没有什么好的方法可以处理嵌套的非阻塞函数调用来解决依赖性问题。
有一个专门讨论这个问题的页面:http://callbackhell.com/
总之,您可以选择
- 按照代码箱的建议使用命名函数
- 使用异步库
- 或使用承诺
如果我没有错的话,您使用的是Angular $http
服务,它应该支持正确的promise链接,这样您就可以将代码简化为
$http.post(url_login, login_request)
.then(function(req){
return $http.pos(url_get_tasks, req.type);
})
.then(function(req){
// update tasks
})
.catch(function(err){
// errors from the first AND second call land here
})
您可以为异步函数编写一个简单的包装器,将它们转化为promise:
// this assumes standard node.js callbacks with the
// signature (error, data)
function toPromise(fn){
return function() {
var args = Array.prototype.slice.call(arguments);
var scope = this;
return new Promise(function(resolve, reject){
var cb = function(err, data) {
return err ? reject(err) : resolve(data);
};
args.push(cb);
fn.apply(scope, args);
});
};
}
// turn fs.readdir into a promise
var readdir = toPromise(require('fs').readdir);
readdir('.')
.then(function(files){
console.log(files);
})
.catch(function(err){
console.log('reading files failed');
})
关于Angular $http
承诺还有另一个问题,这可能有助于您更好地理解它们:这里是
我不能100%确定你在问什么,但如果你想减少代码中的嵌套,你可以像这样移动内部函数:
function success1(req) {
//update tasks
}
function success2(req) {
$http.post(url_get_tasks, req.type).success(success1)
}
$http.post(url_login, login_request).success(success2)
显然,您应该选择比success1
更好的名称,尽管
相关文章:
- 为什么Airbnb风格指南说不鼓励依赖函数名称推断
- 是否可以将一个函数输入连接到另一个函数调用的文本
- 在输入字段上有两个函数调用,一个在Blur上,一个不在Angular中
- 如何在Javascript函数调用中循环变量
- Javascript:应为赋值或函数调用,但实际看到的却是表达式
- 如何远程检查JavaScript应用程序的函数调用堆栈
- javascript函数调用不起作用
- 为什么这个函数调用会破坏程序并导致未定义的变量
- 如何通过函数调用设置图像的src
- 从全局函数调用Ember控制器上的方法
- 为什么Jquery$.ajax在函数调用中触发所有statusCode,即使调用成功
- JavaScript函数调用(arg1)(arg2)
- 打印链接时,将javascript函数调用到链接中
- 在函数调用中封装数据除了隐藏数据之外还有什么优点
- 无法从JavaScript中的函数调用对象属性
- 对中的函数调用进行排序是回调的唯一方法
- 函数调用方法有什么用
- Javascript:JSHint:应为赋值或函数调用,但实际看到的却是表达式
- HTML5(Bootstrap)通过函数调用运行动画
- 解决节点中非阻塞函数调用中的依赖关系