gpt4 book ai didi

javascript - promise 无法正常工作

转载 作者:行者123 更新时间:2023-11-28 23:31:39 24 4
gpt4 key购买 nike

我正在尝试使用 MySql 进行嵌套查询,将结果放入变量中并通过 http 发送,但程序始终运行 console.log("test 2:"+rpsData);在查询完成之前。我已经试过了 this , 但仍然遇到同样的问题。

const express = require('express')  
const app = express()

const mysql = require('mysql');
const Connection = require('mysql/lib/Connection');
const Promise = require('bluebird');

Promise.promisifyAll([
Connection
]);

const connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : 'root123',
database : 'mygallery'
});
app.get('/posts', function(request, response) {
var rpsData;
connection.connectAsync()
.then(function() {
connection.query('SELECT * FROM post WHERE approved = 1', function(err, rows, fields) {
if (err) throw err;
rpsData = rows;
for (var i in rows) {
connection.query('SELECT * FROM image WHERE postCode = ?', [rpsData[i].postCode], function(err, rows, fields) {
if (err) throw err;
rpsData[i].image = rows;
console.log("test 1:"+rpsData);
});
}
});
})
.then(function() {
response.send(rpsData);
console.log("test 2:"+rpsData);
})
.catch(function(error) {
console.error('Connection error.', error);
});
});

最佳答案

这里发生的事情是您没有将所有异步代码片段绑定(bind)到 promise 链。一旦我们将其转换为这样做,这应该可以工作。

首先让我们包装对 connection.query 的调用以返回一个 promise 。然后我们必须返回生成的 promise 以将其附加到外部 promise 链。

如果你不返回一个 promise ,它不会知道它必须等待你的代码完成执行,并将继续执行外部 promise 上的下一个 .then() 语句(来自 connection .connectAsync);

您需要对内部查询应用相同的处理。

示例代码:

app.get('/posts', function(request, response) {
connection.connectAsync()
.then(function() {
return new Promise(function(resolve, reject) {
connection.query('SELECT * FROM post WHERE approved = 1', function(err, rows, fields) {
if (err) reject(err);
resolve(rows.reduce(function(accumulator, current) {
return accumulator.then(function(rpsData){
return new Promise(function(resolve, reject){
connection.query('SELECT * FROM image WHERE postCode = ?', [current.postCode], function(err, rows, fields) {
if (err) reject(err);
current.image = rows;
console.log("test 1:"+rpsData);
resolve(rpsData);
});
});
});
}, Promise.resolve(rows)));
});
});
})
.then(function(rpsData) {
response.send(rpsData);
console.log("test 2:"+rpsData);
})
.catch(function(error) {
console.error('Connection error.', error);
});
});

我正在使用 I describe here 技术对内部 promise 进行排队

关于javascript - promise 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37146241/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com