Javascript 等待内部函数完成,然后返回值

Javascript 等待内部函数完成,然后返回值,javascript,mysql,node.js,Javascript,Mysql,Node.js,我有一个函数,可以进行数据库查询,然后需要返回结果 使用Node.js将查询发送到mysql数据库,然后将结果返回到查询器(NPM模块)提示符 如果这是一个前端问题,我会使用jquery的内置承诺:(示例)。$。ajax.done()。但是,mysql NPM包没有为query()方法提供内置承诺 //选项1,在返回choicesArray之前等待查询完成(本例返回一个空数组) 选择(){ 让choicesArray=[]; connection.query(`SELECT*FROM prod

我有一个函数,可以进行数据库查询,然后需要返回结果

使用Node.js将查询发送到mysql数据库,然后将结果返回到查询器(NPM模块)提示符

如果这是一个前端问题,我会使用jquery的内置承诺:(示例)。$。ajax.done()。但是,mysql NPM包没有为query()方法提供内置承诺

//选项1,在返回choicesArray之前等待查询完成(本例返回一个空数组)
选择(){
让choicesArray=[];
connection.query(`SELECT*FROM products`,(err,res)=>{
关于(决议项目){
choicesArray.push(`${item.product}|${item.price}`);
};
});
//在此处等待查询完成
返回选择数组;
}
//选项2,更改语法以利用查询回调,如下所示(此示例不会将choicesArray完全返回到封闭函数)
选择(){
connection.query(`SELECT*FROM products`,(err,res)=>{
让choicesArray=[];
关于(决议项目){
choicesArray.push(`${item.product}|${item.price}`);
};
返回选择数组;
});

}//(节点:3877)未处理的PromisejectionWarning:未处理的承诺拒绝(拒绝id:1):错误:您必须提供'choices'参数
您不能从这样的异步函数返回值。该函数在异步值准备就绪之前返回。您需要使用如下回调:

function choices(cb) {
    let choicesArray = [];
    connection.query(`SELECT * FROM products`, (err, res)=>{
    if (err) {
        cb(err)
        return
    }
    for (item of res) {
        choicesArray.push(`${item.product} | ${item.price}`);
    };
    });
    // wait here for query to complete
    cb(null, choicesArray);
}

choices((err, value) =>{
    if (err) {
        // handle error
    } 
    // use value here
})
或者回报一个承诺,比如:

function choices() {
    return new Promise((resolve, reject) => {
        connection.query(`SELECT * FROM products`, (err, res)=>{        
            if (err) return reject(err)
            let choicesArray = [];            
            for (item of res) {
                choicesArray.push(`${item.product} | ${item.price}`);
            }
            resolve(choicesArray)
        });

    })
}

choices()
.then(value => {
    // use value here
})
.catch(err =>{
    // handle error
})

您可能应该使用承诺或回调(或异步,如果您使用的是节点)。@Quentin为前端ajax调用提供了一个很好的资源:。我认为这一问题有足够的不同之处,值得具体回答。您是否将其取消标记为重复?这不是前端ajax调用并不重要。这是一个异步调用,解决方案是相同的。