Javascript 使用then()使函数在节点中按顺序运行

Javascript 使用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(){

我想在顺序总线中运行循环函数,该函数总是异步的 有没有办法不使用回调或任何外部库使其同步

文件1

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);
    });
}