Javascript 解决节点中非阻塞函数调用的依赖关系
在nodejs中,很多函数调用都是作为非阻塞函数实现的。有时,这些函数调用之间可能存在依赖关系。例如,当用户登录时,我希望首先获得用户的用户类型,然后根据用户类型,我可以获得刚刚分配给此用户类型的任务。在非阻塞函数中,我使用嵌套函数调用:Javascript 解决节点中非阻塞函数调用的依赖关系,javascript,node.js,asynchronous,node-redis,Javascript,Node.js,Asynchronous,Node Redis,在nodejs中,很多函数调用都是作为非阻塞函数实现的。有时,这些函数调用之间可能存在依赖关系。例如,当用户登录时,我希望首先获得用户的用户类型,然后根据用户类型,我可以获得刚刚分配给此用户类型的任务。在非阻塞函数中,我使用嵌套函数调用: $http.post(url_login, login_request) .success(function(req) { $http.post(url_get_tasks, req.type) .s
$http.post(url_login, login_request)
.success(function(req) {
$http.post(url_get_tasks, req.type)
.success(function(req) {
//update tasks
})
})
很多库只提供非阻塞函数,例如node_redis库。有没有处理嵌套的非阻塞函数调用的好方法来解决依赖性问题。我不是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)
显然,您应该选择比成功更好的名称1,尽管有专门针对这个问题的页面: 总而言之,你有选择权
- 要使用命名函数
- 使用图书馆
- 或者使用承诺
$http
服务,该服务应支持正确的
承诺链接,这样您就可以将代码简化为
$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
})
您可以为异步函数编写一个简单的包装器,将它们转换为承诺:
// 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
承诺的问题可能会帮助您更好地理解它们:看看“异步”模块:特别是“瀑布”函数。