在node.js中调用多个异步函数的正确过程
Correct procedure to call multiple asynchronous functions in node.js
我有一个要求,我需要从表1中获取记录并存储在redis缓存中,一旦redis缓存完成存储,就获取表2的记录并存储到redis缓存。因此有4个异步函数。
步骤:
- 获取表1记录
- 存储在redis缓存中
- 获取表2记录
- 存储在redis缓存中
正确的处理程序是什么?
下面是我为处理它而写的代码。请确认这是否是正确的过程或根据node.js 处理它的任何其他方法
var redis = require("redis");
var client = redis.createClient(6379, 'path', {
auth_pass: 'key'
});
var mysqlConnection = // get the connection from MySQL database
get_Sections1()
function get_Sections1() {
var sql = "select *from employee";
mysqlConnection.query(sql, function (error, results) {
if (error) {
console.log("Error while Sections 1 : " + error);
} else {
client.set("settings1", JSON.stringify(summaryResult), function (err, reply){
if (err) {
console.log("Error during Update of Election : " + err);
} else {
get_Sections2();
}
});
}
});
}
function get_Sections2()
{
var sql = "select *from student";
mysqlConnection.query(sql, function (error, results)
{
if (error)
{
console.log("Error while Sections 2 : " + error);
}
else
{
client.set("settings2", JSON.stringify(summaryResult), function (err, reply)
{
if (err)
{
console.log("Error during Update of Election : " + err);
}
else
{
console.log("Finished the task...");
}
});
}
});
}
创建两个参数化函数。一个用于检索,一个用于存储。
然后答应他们两个。
然后写:
return getTableRecords(1)
.then(storeInRedisCache)
.then(getTableRecords.bind(null,2))
.then(storeInRedisCache)
.then(done);
为了承诺一个函数,这样的东西可能会起作用:
var getEmployees = new Promise(function(resolve, reject) {
var sql = "select *from employee";
mysqlConnection.query(sql, function (error, results) {
if (error) {
return reject();
} else {
return resolve(results);
}
});
});
如果您使用的是旧版本的NodeJS,那么Promise
需要一个polyfill。
以下是Ben Aston使用Promise.coroutine
假设承诺的解决方案的替代方案:
const doStuff = Promise.coroutine(function*(){
const records = yield getTableRecords(1);
yield storeRecordsInCache(records);
const otherRecords = yield getTableRecords(2);
yield storeRecordsInCache(otherRecords); // you can use loops here too, and try/cath
});
doStuff(); // do all the above, assumes promisification
或者,如果你想使用Node中还没有的语法(并使用Babel来获得支持),你可以这样做:
async function doStuff(){
const records = await getTableRecords(1);
await storeRecordsInCache(records);
const otherRecords = await getTableRecords(2);
await storeRecordsInCache(otherRecords); // you can use loops here too, and try/cath
})
相关文章:
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 在异步函数调用过程中,当对象的属性值发生变化时,JavaScript中的对象属性值会发生什么变化
- JS中jQuery函数的过程顺序
- jQuery $.ajax 函数在执行过程中停止
- 每次选择数据库列时调用 SQL“函数”(存储过程?
- Javascript 函数创建自己的 ,但在此过程中删除网页上的所有其他
- AngularJS:TypeScript编译过程并吞噬uglify-是否有一种方法可以强制TS使用IIFE生成函数而不是
- 从另一个事件(或函数)跳过ajax(或任何其他过程)
- 如何在javascript中调用pl/sql过程和函数
- 我可以派生一个Web Worker并从父“”向其注入JavaScript函数吗;过程”;
- 在node.js中调用多个异步函数的正确过程
- 关于js中函数运行过程的问题
- 如何重载任意函数的调用过程
- 当调用适配器的过程失败时,失败函数不会执行
- Ember.js: "Undefined不是一个函数"在内部引导过程中
- 如何反复调用同一个JavaScript函数,同时等待函数运行它的过程,然后再调用它,使用方法链
- 需要了解Web进程背后的过程与HTML, PHP, Javascript,通过现有的HTML按钮到PHP函数问题
- 在JavaScript初始化过程中调用函数的正确方法
- 函数调用过程中的鼠标位置
- 理解下面的javascript函数和过程