async.auto 中的任务结果
Results of tasks in async.auto
我对 async.auto 中从一项任务到另一项任务的结果逻辑有点困惑。例如,在下面的代码逻辑中,我向 task1
中的模型添加了一些数据,这最初是 initialtask
的输出,而在 finalTask
中,向 task1
中的模型添加的数据被反映出来在 results.initialTask1
中也是如此。 task2
中类似添加的数据反映在 finalTask
中的 results.initialTask1
中。
总结results.initialTask1
、results.task1[0]
、results.task2[0]
、results.task3[0]
在[=4=中完全相同].这就是async.auto
的逻辑吗?或者它是否类似于 C++ 中的指针引用,它会导致 task1
中的模型发生任何变化,它也会反映在 initialTask
中的模型中?
async.auto({
initialTask: function(callback) {
//Do some operations
callback(null, name, initialModels);
},
task1: ['initialTask', function(callback, results) {
var models = results.initialTask[1];
//Add some more data to models
callback(null, models);
}],
task2: ['initialTask', function(callback, results) {
var models = results.initialTask[1];
//Add some more data to models
callback(null, models);
}],
task3: ['initialTask', function(callback, results) {
var models = results.initialTask[1];
//Add some more data to models
callback(null, models);
}],
finalTask: ['task1', 'task2', 'task3', function(callback, results) {
//Here the followings are the same: results.initialTask[1], results.task1[0], results.task2[0], results.task3[0]
}]
});
我正在寻找可以帮助我确定是否符合逻辑的答案?我不一定要寻找任何官方文件或...
这是预期的行为。基本上 async.auto
将按照它认为必要的顺序执行所有功能。所以在你的情况下 initialTask
将首先被调用。然后 task1
、task2
和 task3
将被并行调用。最后 finalTask
将调用结果。所有值都相同的原因与 JavaScript 的 call-by-sharing 有关,这意味着如果您更改函数参数本身,那么它不会影响输入参数的项目。如果您更改参数的内部结构,它将携带到项目。
更多信息here。
示例:
async.auto({
// this function will just be passed a callback
readData: async.apply(fs.readFile, 'data.txt', 'utf-8'),
showData: ['readData', function(results, cb) {
// results.readData is the file's contents
// ...
}]
}, callback);
async.auto({
get_data: function(callback) {
console.log('in get_data');
// async code to get some data
callback(null, 'data', 'converted to array');
},
make_folder: function(callback) {
console.log('in make_folder');
// async code to create a directory to store a file in
// this is run at the same time as getting the data
callback(null, 'folder');
},
write_file: ['get_data', 'make_folder', function(results, callback) {
console.log('in write_file', JSON.stringify(results));
// once there is some data and the directory exists,
// write the data to a file in the directory
callback(null, 'filename');
}],
email_link: ['write_file', function(results, callback) {
console.log('in email_link', JSON.stringify(results));
// once the file is written let's email a link to it...
// results.write_file contains the filename returned by write_file.
callback(null, {'file':results.write_file,
'email':'user@example.com'});
}]
}, function(err, results) {
console.log('err = ', err);
console.log('results = ', results);
});
async.auto 是 Async Lib 提供的非常有用和强大的功能。它有 3 个字段
1-任务
2-并发
3-回调
在Async.auto中,除了第一个函数之外,每个函数都依赖于它的父函数,如果任何函数在执行过程中会出错。那么他们的子函数或者说..他们下面定义的函数将不会得到进一步执行,回调将发生错误,主回调将立即 return 并出现错误
1- 任务 :- 一个对象
2- 并发性:- 一个可选的整数,用于确定可以并行 运行 的最大任务数。默认情况下,尽可能多。
3- 回调:- return 响应
例子-
AnyService.prototype.forgetPassword = function (res, email, isMobile, callback) {
Logger.info("In AnyService service forgetPassword email...", email);
db.User.findOne({
email: email.toLowerCase(),
deleted: false
}, function (err, user) {
if (!user) {
configurationHolder.responseHandler(res, null, configurationHolder.LoginMessage.registerFirst, true, 403)
} else {
async.auto({
token: function (next, results) {
return gereratePasswordToken(next, email, user, isMobile);
},
sendMail: ['token', function (next, result) {
return SendMailService.prototype.forgetPasswordMail(next, result.token, email, user.fullName);
}]
}, function (err, result) {
if (err == null && result != null) {
configurationHolder.ResponseUtil.responseHandler(res, null, configurationHolder.LoginMessage.forgotPassword, false, 200)
} else {
callback(new Error(configurationHolder.errorMessage.oops))
}
})
}
});
}
我对 async.auto 中从一项任务到另一项任务的结果逻辑有点困惑。例如,在下面的代码逻辑中,我向 task1
中的模型添加了一些数据,这最初是 initialtask
的输出,而在 finalTask
中,向 task1
中的模型添加的数据被反映出来在 results.initialTask1
中也是如此。 task2
中类似添加的数据反映在 finalTask
中的 results.initialTask1
中。
总结results.initialTask1
、results.task1[0]
、results.task2[0]
、results.task3[0]
在[=4=中完全相同].这就是async.auto
的逻辑吗?或者它是否类似于 C++ 中的指针引用,它会导致 task1
中的模型发生任何变化,它也会反映在 initialTask
中的模型中?
async.auto({
initialTask: function(callback) {
//Do some operations
callback(null, name, initialModels);
},
task1: ['initialTask', function(callback, results) {
var models = results.initialTask[1];
//Add some more data to models
callback(null, models);
}],
task2: ['initialTask', function(callback, results) {
var models = results.initialTask[1];
//Add some more data to models
callback(null, models);
}],
task3: ['initialTask', function(callback, results) {
var models = results.initialTask[1];
//Add some more data to models
callback(null, models);
}],
finalTask: ['task1', 'task2', 'task3', function(callback, results) {
//Here the followings are the same: results.initialTask[1], results.task1[0], results.task2[0], results.task3[0]
}]
});
我正在寻找可以帮助我确定是否符合逻辑的答案?我不一定要寻找任何官方文件或...
这是预期的行为。基本上 async.auto
将按照它认为必要的顺序执行所有功能。所以在你的情况下 initialTask
将首先被调用。然后 task1
、task2
和 task3
将被并行调用。最后 finalTask
将调用结果。所有值都相同的原因与 JavaScript 的 call-by-sharing 有关,这意味着如果您更改函数参数本身,那么它不会影响输入参数的项目。如果您更改参数的内部结构,它将携带到项目。
更多信息here。
示例:
async.auto({
// this function will just be passed a callback
readData: async.apply(fs.readFile, 'data.txt', 'utf-8'),
showData: ['readData', function(results, cb) {
// results.readData is the file's contents
// ...
}]
}, callback);
async.auto({
get_data: function(callback) {
console.log('in get_data');
// async code to get some data
callback(null, 'data', 'converted to array');
},
make_folder: function(callback) {
console.log('in make_folder');
// async code to create a directory to store a file in
// this is run at the same time as getting the data
callback(null, 'folder');
},
write_file: ['get_data', 'make_folder', function(results, callback) {
console.log('in write_file', JSON.stringify(results));
// once there is some data and the directory exists,
// write the data to a file in the directory
callback(null, 'filename');
}],
email_link: ['write_file', function(results, callback) {
console.log('in email_link', JSON.stringify(results));
// once the file is written let's email a link to it...
// results.write_file contains the filename returned by write_file.
callback(null, {'file':results.write_file,
'email':'user@example.com'});
}]
}, function(err, results) {
console.log('err = ', err);
console.log('results = ', results);
});
async.auto 是 Async Lib 提供的非常有用和强大的功能。它有 3 个字段 1-任务 2-并发 3-回调
在Async.auto中,除了第一个函数之外,每个函数都依赖于它的父函数,如果任何函数在执行过程中会出错。那么他们的子函数或者说..他们下面定义的函数将不会得到进一步执行,回调将发生错误,主回调将立即 return 并出现错误
1- 任务 :- 一个对象 2- 并发性:- 一个可选的整数,用于确定可以并行 运行 的最大任务数。默认情况下,尽可能多。 3- 回调:- return 响应
例子-
AnyService.prototype.forgetPassword = function (res, email, isMobile, callback) {
Logger.info("In AnyService service forgetPassword email...", email);
db.User.findOne({
email: email.toLowerCase(),
deleted: false
}, function (err, user) {
if (!user) {
configurationHolder.responseHandler(res, null, configurationHolder.LoginMessage.registerFirst, true, 403)
} else {
async.auto({
token: function (next, results) {
return gereratePasswordToken(next, email, user, isMobile);
},
sendMail: ['token', function (next, result) {
return SendMailService.prototype.forgetPasswordMail(next, result.token, email, user.fullName);
}]
}, function (err, result) {
if (err == null && result != null) {
configurationHolder.ResponseUtil.responseHandler(res, null, configurationHolder.LoginMessage.forgotPassword, false, 200)
} else {
callback(new Error(configurationHolder.errorMessage.oops))
}
})
}
});
}