在返回值之前等待内部函数完成

我有一个函数可以进行数据库查询,然后需要返回结果。在返回值之前等待内部函数完成

查询是使用Node.js到mysql数据库,结果然后返回到询问者(NPM模块)提示。

如果这是前端问题,我会使用jquery的内置承诺:(示例)。 $ .ajax.done()。然而,mysql NPM软件包并没有内置query()方法的promise。

// OPTION 1, wait for query to complete before returning choicesArray (this example returns an empty array)  

choices() {

let choicesArray = [];

connection.query(`SELECT * FROM products`, (err, res)=>{

for (item of res) {

choicesArray.push(`${item.product} | ${item.price}`);

};

});

// wait here for query to complete

return choicesArray;

}

// OPTION 2, change the syntax to take advantage of the query callback, something more like below (this example does not return the choicesArray all the way to the enclosing function)

choices() {

connection.query(`SELECT * FROM products`, (err, res)=>{

let choicesArray = [];

for (item of res) {

choicesArray.push(`${item.product} | ${item.price}`);

};

return choicesArray;

});

} // (node:3877) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: You must provide a `choices` parameter

回答:

不能从这样一个异步函数返回一个值。该函数在异步值就绪之前返回。你要么需要使用一个回调,如:

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

})

以上是 在返回值之前等待内部函数完成 的全部内容, 来源链接: utcz.com/qa/258396.html

回到顶部