js 我只是創建了一個 2 函式來發送回應 var = y 但不幸的是 res.end() 作業之前我的 y 作業..
這段代碼在沒有我的查詢的情況下可以很好地與 for 回圈配合使用,但是當我使用查詢時,它會停止作業并給出如下所示的 res。在承諾電話之前。回圈完成。承諾已解決:0 下一步。13289、2170、2165、2146、2115、2138、2143、2112、1964、2685、6945、2687、2688、2902、2935、2941、3094、3095、3164、3096、
var http = require('http');
var url = require('url');
var fs = require('fs');
var mysql = require('mysql');
http.createServer(function (req, res) {
var q = url.parse(req.url, true);
var end = '';
var con = mysql.createConnection({
host: "localhost",
user: "root",
password: "",
database: "justcode"
});
//1. Create a new function that returns a promise
function firstFunction() {
return new Promise((resolve, reject) => {
let arr = [];
con.connect(function (err) {
if (err) throw err;
con.query("SELECT * FROM wp_posts WHERE `post_type` = 'post'", async function (err, result, fields) {
if (err) throw err;
result.forEach(element => {
arr.push(element['ID']);
});
resolve(arr)
});
});
})
}
//2. Create an async function
async function secondFunction() {
//3. Await for the first function to complete
const result = await firstFunction()
res.end(JSON.stringify(result));
};
secondFunction()
}).聽(8080);
這是作業代碼::::
uj5u.com熱心網友回復:
這個怎么樣...
//1. Create a new function that returns a promise
function firstFunction() {
return new Promise((resolve, reject) => {
let y = 0
con.connect(function (err) {
if (err) throw err;
con.query("SELECT * FROM wp_posts WHERE `post_type` = 'post'", async function (err, result, fields) {
if (err) throw err;
result.forEach(element => {
console.log(element['ID']);
y ;
});
// get the results from post table
console.log('Loop completed.')
resolve(y); // <---- Resolve the promise here
});
});
// for (i = 0; i < 100; i ) {
// y
// }
// console.log('Loop completed.')
// resolve(y) // <--- Moving this inside con.query callback
})
}
//2. Create an async function,
async function secondFunction() {
console.log('Before promise call.')
//3. Await for the first function to complete
const result = await firstFunction()
console.log('Promise resolved: ' result)
console.log('Next step.')
res.end();
};
secondFunction()
原始問題中的問題
con.query是asynchronous執行。它接受一個回呼函式,然后在操作完成后呼叫該回呼函式。javascript有一些呼叫runToCompletion,其中函式的執行一直持續到最后一條陳述句。
當secondFunction被呼叫時,它會進一步呼叫(with an await) firstFunction,它回傳 aPromise并開始執行 Promise,但呼叫者secondFunction正在等待 Promise 完成。
在 Promise 的執行程序中firstFunction,有一個對 的呼叫con.query,這是一個asynchronous呼叫,但沒有被等待。因此,在呼叫對 的呼叫之后con.query,javascript 執行會繼續進一步......只是resolve在幾條陳述句之后遇到 a 。Aresolve完成 Promise of 的執行firstFunction并將控制權傳遞回secondFunction,然后從那里繼續執行。現在,由于呼叫con.query將在一段時間后完成,當它完成時,回呼函式將被執行。所以我們認為這種行為是有問題的。但這一切都是按照javascript執行的語意發生的。
uj5u.com熱心網友回復:
假設您使用的是mysql,因為它不提供開箱即用的 Promise API,您可能需要對呼叫進行 Promisifyconnect()并query()呼叫您自己并await為他們呼叫。
async function firstFunction() {
let y = 0;
await new Promise((resolve,reject)=>{
con.connect(function (err) {
if (err) reject(err);
resolve();
});
});
let result = await new Promise((resolve,reject)=>{
con.query("SELECT * FROM wp_posts WHERE `post_type` = 'post'", (err, result, fields) => {
if (err) reject(err);
resolve(result);
// get the results from post table
});
});
result.forEach(element => {
console.log(element['ID']);
y ;
});
// for (i = 0; i < 100; i ) {
// y
// }
console.log('Loop completed.')
return y;
}
或者,您可以嘗試使用包裝庫,如mysql-promise和promise-mysql
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/415433.html
標籤:
