Javascript 使用then()使函数在节点中按顺序运行
我想在顺序总线中运行循环函数,该函数总是异步的 有没有办法不使用回调或任何外部库使其同步 文件1Javascript 使用then()使函数在节点中按顺序运行,javascript,node.js,loops,Javascript,Node.js,Loops,我想在顺序总线中运行循环函数,该函数总是异步的 有没有办法不使用回调或任何外部库使其同步 文件1 var db = require('./promiseUnderStanding'); var fun = function () { for (var i = 0; i < 10; i++) { db.getFromDb(i, 0); } } fun(); 若函数是异步的,这意味着它返回一个承诺 const myFunc = function(){
var db = require('./promiseUnderStanding');
var fun = function () {
for (var i = 0; i < 10; i++) {
db.getFromDb(i, 0);
}
}
fun();
若函数是异步的,这意味着它返回一个承诺
const myFunc = function(){
return new Promise(function(resolve, reject){
if(failed){
reject(dataSendToCatch);
}if(!failed){
resolve(dataSendToThen);
}
})
};
这几乎与:
const myFunc = async function(){
if(failed) throw new Error();
return dataSendToThen;
};
运行函数后,可以链接异步甚至同步函数:
myFunc()
.then(function(dataFromResolve){return otherFunc()})
.then(function(dataFromOtherFunc){/*...*/});
对于连续处理、筛选,映射从异步函数接收的数据是一个很好的库。无法同步运行异步承诺 然而,您要寻找的是
Promise.all()
。另外,connection.open
也是异步的,快速打开和关闭到mysql的连接是没有效率的。您应该在循环之前打开连接,执行查询,然后关闭它(在我的示例中未显示)
范例
文件1:
var db = require('./promiseUnderStanding');
var fun = function () {
var promises = [];
for (var i = 0; i < 10; i++) {
promises.push[db.getFromDb(i, 0)];
}
Promise.all(promises).then(function(values){
console.log(values):
})
}
fun();
const fun = async function () {
for (var i = 0; i < 10; i++) {
await db.getFromDb(i, 0);
}
}
fun().then(onFinish).catch(onError);
您的问题似乎是关于异步函数的,所以我认为数据库逻辑超出了范围 使用: 文件1:
var db = require('./promiseUnderStanding');
var fun = function () {
var promises = [];
for (var i = 0; i < 10; i++) {
promises.push[db.getFromDb(i, 0)];
}
Promise.all(promises).then(function(values){
console.log(values):
})
}
fun();
const fun = async function () {
for (var i = 0; i < 10; i++) {
await db.getFromDb(i, 0);
}
}
fun().then(onFinish).catch(onError);
- 返回承诺的函数是异步的
- 承诺必须解决或拒绝
- 调用异步函数B时,在异步函数A中使用wait,以等待B的承诺解析或拒绝
- 如果使用async关键字定义函数,其返回值将封装在隐式承诺中
连接.end()
可能位于错误的位置,那么它不应该是calback的一部分吗(否则您的连接可能在真正执行查询之前就关闭了?)您可以在javascript中阅读有关async Wait的内容。您应该使用遵循ES6的现代JS概念,比如使用let
和const
而不是var
和async wait
而不是回调。您也可以使用Promise.all
。我知道缩进是可选的,但这很难阅读,为什么不将代码块格式化一点呢?给您;)是的,答应我,一切都会解决问题的。我认为在node中编写不必要的同步代码不是一个好主意。
module.exports.getFromDb = function() {
return new Promise((resolve, reject) => {
// If success
resolve(result);
// If fail
reject(error);
});
}