gpt4 book ai didi

mysql - Node.js Promise 概念在 if else 条件下的 then block

转载 作者:可可西里 更新时间:2023-11-01 11:13:22 24 4
gpt4 key购买 nike

我有一个场景,其中 web 服务需要检查 redis 中是否存在 key (如果存在)将其作为响应提供,否则从 mysql 获取它,存储在 redis 中,然后将其作为响应提供。

所以我使用的是 promise 概念,当我第一次调用 return new Set_Data(); 它不会转到下一个 then block 它只是保持空闲。但是下一次,因为数据已经存在,所以 return new Set_Data();没有执行这是正确的。

但为什么当我调用 return new Set_Data(); 时我第一次遇到问题,这不会用于 next then block 。

下面是我的代码

constants.js 文件

var Promise = require('bluebird');

module.exports =
{
getRedisConnection: function ()
{
return require("redis").createClient(6379, 'path', { auth_pass: 'key' });
},
getMySqlConnection: function ()
{
var conObj = { host: "localhost", user: "root", password: "", database: "deccan" };

var connection = require("mysql").createConnection(conObj);

return new Promise(function (resolve, reject)
{
connection.connect(function (error)
{
if (error)
reject(error);
else
resolve(connection);
});
});
}
};

webservicefile.js

var Promise = require('bluebird');
var express = require('express');
var router = express.Router();

var constants = require("../constants");


function getSettings(request, response)
{
var client = constants.getRedisConnection();

get_Data();

function get_Data()
{
return new Promise(function (resolve, reject)
{
client.get("url", function (error, reply)
{
if (error)
reject(error);
else
{
if (reply == null)
resolve(); // Key not present so create
else
resolve(reply);
}
});
}).
catch(function (e)
{
console.log("Error at : " + new Date().toString() + ", => " + e);
}).
then(function (urlResult)
{
return new Promise(function (resolve, reject)
{
if (urlResult == undefined || urlResult == null)
{
return new Set_Data();
}
else
{
client.quit();
return resolve(urlResult);
}
});
}).
then(function (urlResult)
{
if (urlResult)
response.status(200).send({ url : urlResult });
else
response.status(500).send();
})
}


function Set_Data()
{
constants.getMySqlConnection().then(function (connection)
{
return new Promise(function (resolve, reject)
{
connection.query("select url from table where id = 1", function (error, results)
{
connection.end();

if (error)
reject(error);
else
resolve(results);
});
});
}).
then(function (url)
{
return new Promise(function (resolve, reject)
{
client.set('url', url, function (err, reply)
{
if (err)
reject(err);
else
resolve(url);
});
});

});
}
}

最佳答案

一些更改应该可以解决问题,首先 Set_Data() 不会像您认为的那样返回 promise ,添加一个 return:

function Set_Data() {
return constants.getMySqlConnection().then(function (connection).then()
// ...
}

在此回调中,您在 if 中没有 resolve(),因此 promise 永远不会被解决,返回的东西不会解决:

// your code
then(function (urlResult) {
return new Promise(function (resolve, reject) {
if (urlResult == undefined || urlResult == null) {
return new Set_Data();
} else {
client.quit();
return resolve(urlResult);
}
});
}).

返回 Set_Data() 现在是一个 promise 或 url:

then(function (urlResult) {
if (urlResult == undefined || urlResult == null) {
return new Set_Data();
} else {
client.quit();
return urlResult;
}
}).

注意,不要像 C# 那样格式化你的 js 代码,{ 不应该换行。

关于mysql - Node.js Promise 概念在 if else 条件下的 then block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34465737/

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