Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 承诺完成后,如何恢复功能?_Javascript_Mysql_Promise - Fatal编程技术网

Javascript 承诺完成后,如何恢复功能?

Javascript 承诺完成后,如何恢复功能?,javascript,mysql,promise,Javascript,Mysql,Promise,我正在尝试设置一个链接到数据库的js messenger聊天机器人。 当然,有时候,用户从数据库向聊天机器人请求数据,我确实使用promise来收集数据。我最近了解了他们,所以我只知道基本知识。 我的问题是,当承诺实现时,我不仅需要触发一些代码(通过then()函数完成),还需要将数据返回到主模块以创建答案。 在履行承诺后,我如何恢复我的职能(以实现回报)? 我可能很难理解,所以这是我聊天机器人的序列图和一些代码 app.js const-Database=require(“./服务/数据库”

我正在尝试设置一个链接到数据库的js messenger聊天机器人。 当然,有时候,用户从数据库向聊天机器人请求数据,我确实使用promise来收集数据。我最近了解了他们,所以我只知道基本知识。 我的问题是,当承诺实现时,我不仅需要触发一些代码(通过then()函数完成),还需要将数据返回到主模块以创建答案。 在履行承诺后,我如何恢复我的职能(以实现回报)? 我可能很难理解,所以这是我聊天机器人的序列图和一些代码

app.js

const-Database=require(“./服务/数据库”);
const Message=require(“./服务/消息”);
app.get(“/endpoint)”,(请求,res)=>{
让消息
//检查用户消息是否包含请求数据
if(req==数据请求)
{
message=Database.request();
}
其他的
{
message=“您不需要任何数据”;
}
Message.sendToUser(Message);
});
DBInteractionModule.js

异步请求()
{
//创造承诺
让承诺=新的承诺(
函数(){
让connection=db.connect();
返回connection.query(“SELECT*FROM user;”);
}
);
//返回数据时使用数据的唯一方法
promise.then(函数(数据)
{
console.log(“请求的数据:+数据”);
});
//我需要使用此返回以便将数据返回到主应用程序
回报承诺;
}

谢谢:)

承诺在你第一次使用时是很棘手的,但一旦你习惯了,就要等待,然后解决或拒绝承诺

我假设,
db.connect
connection.query
都返回一个承诺,所以您必须等待它们兑现这些承诺

 // the `async` word before the functions here is important
 const request = new Promise(async (resolve, reject) => {
    // wait for the db to connect
    let connection = await db.connect();

    // wait for the db to return it's data
    const data = await connection.query("SELECT * FROM user;");

    // after waiting, if no error, the data should be available now
    console.log('Requested data (WITHIN the promise) : ', data);

    //return the data by resolving the main promise
    resolve(data)
});
用法:

request.then(data => {
     console.log('Requested data (OUTSIDE the promise) : ', data);
     //Process data
});
或者在另一个异步函数中:

async function main() {
     const data = await request;
     console.log('Requested data (OUTSIDE the promise) : ', data);
}

异步函数总是返回一个承诺(!)。所以你是在回报我的承诺。如果您只返回
数据
(成功时),则返回值将与数据一起使用。然后您可以使用
Then()
访问app.js中的“数据”,谢谢您的回复,我想我理解了这一点。然而,我在这里面临的问题是,我不能使用异步函数(因为我使用的是仅为同步而编写的现有代码),我需要在我承诺的地方使用返回函数。类似这样:``myFunction(){const request=New Promise(…);//创建我的Promise wich将获得db数据请求。然后({//我可以在这里处理数据,但我希望它返回到父函数});返回数据;}``我最终解决了我的问题,将异步放在我使用的每个函数之前,以便“等待”每次我叫一个。但我仍然想知道是否还有其他解决办法,因为(我认为)使每个函数异步的技巧可能在任何时候都不起作用。我曾经是一个噩梦回到过去,当承诺不存在,他们不得不使用回调…很高兴这能帮助你,是的,这是一个噩梦之前。。。现在请记住,将
async
放在任何有承诺的函数之前,并等待这些承诺实现,始终检查文档以查看是否有任何方法返回承诺,它可以是任何形式的db调用、图像或视频加载、Api、远程数据。。。