javascript 等待JS回调返回主线程[重复]

iq0todco  于 2023-02-28  发布在  Java
关注(0)|答案(2)|浏览(157)
    • 此问题在此处已有答案**:

How do I convert an existing callback API to promises?(24个答案)
5小时前关门了。
我正在尝试在我的网站上设置身份验证和帐户创建页面(没什么太复杂的,只是开始使用express和SQLite)。我的问题是我的添加用户的功能(或连接)在与数据库交互的不同步骤上具有回调,而且我想等它们全部完成后再结束函数,这样我就可以通过express响应把数据传回前面了。该数据将包括数据库中的任何错误代码(用户已经存在)和当有人连接时的实际用户数据。

function addUser(username,password)
{
  var db = new sqlite3.Database('./database/users.db',sqlite3.OPEN_READWRITE, (err) => {
    if (err) {
      console.error("open error code : "+err.errno+" ; msg : "+err.message);
    }
  });
  var statement=db.prepare("INSERT into users(username,password) VALUES(?,?)")
  statement.run(username,password,(err)=>{
    if (err) {
      console.error("run error code : "+err.errno+" ; msg : "+err.message);
    }
  });
  statement.finalize((err)=>{
    if(err)
    {
      console.error("finalize error code : "+err.errno+" ; msg : "+err.message);
    }
  })
  db.close()
}

理想情况下,服务器的答案应该如下所示

app.post('/addUser',jsonParser,(req,res)=>{  
  res.status(200).send(JSON.stringify({error : addUser(req.body.username,req.body.password)}))
});

其中addUser返回在其步骤中生成的任何err.errno(当前没有)。
我尝试过声明一个变量来存储错误(类似地,也可以存储connectAsUser(username,password)函数的用户数据),但是addUser(username,password)的线程会在回调err之前完成。我也尝试过promises,但是我很快就陷入了混乱的范围。
编辑:我设法找到了一个解决办法,玩弄承诺,然后()。
功能代码:

async function addUser(username,password)
{
  var resp = {
    openError : "",
    runError : "",
    finalizeError : ""
  }
  var data = {
    db : null,
    statement : null,
  }
  var promisedDB = new Promise((resolve,reject)=>{
    var db = new sqlite3.Database('./database/users.db',sqlite3.OPEN_READWRITE, (err) => {
      if (err) {
        resp.openError=err.errno
        reject()
      }
      else
      {
        data.db=db
        resolve()
      }
    });
  })
  await promisedDB.then(_=>{
    return new Promise((resolve,reject)=>{
      var statement=data.db.prepare("INSERT into users(username,password) VALUES(?,?)")
      statement.run(username,password,(err)=>{
      if (err) {
        resp.runError=err.errno
        reject(err)
      }
      else
      {
        data.statement=statement
        resolve()
      }
    })
    })
  }).then(_=>
    {
      return new Promise((resolve,reject)=>{
        data.statement.finalize((err)=>{
          if(err)
          {
            resp.finalizeError=err.errno
            reject(err)
          }
          else
          {
            resolve()
          }
        })
      })
    }).then(_=>{
      data.db.close()
    }).catch(err=>{
      console.log(err)
    })
    return resp
}

并且来自服务器的回答是:

app.post('/addUser',jsonParser,(req,res)=>{
  addUser(req.body.username,req.body.password).then((value)=>{
    console.log(value)
    res.status(200).send(JSON.stringify(value))
  })
});

我已经运行了一些测试,必须在addUser()函数中使用data {}这样的对象,才能在整个代码中编辑变量(就像在其他语言中传递引用/地址一样)。

brgchamk

brgchamk1#

也许试试

async function addUser() { return data}
var data = await addUser();
//blocking if resolve and next ....
app.post({send:data})

async function addUser() { return data}
addUser().then((data)=>{app.post({send:data})});
   //non-blocking and next ....

var resp = {}
var response= new Promise((resolve)=>{resp.resolve = resolve})

async function addUser() { 
example.run(a)=>{
resp.resolve(a);
}}
response.then((data)=>{app.post({send:data})});

async function* reader() {
  while (true) {
    const value = yield;
    console.log(value, '-----generator');
  }
}

const read = reader();
var i =0

read.next(0) //first value not return

async function create(val) {

await read.next(val); 


}

function addUser() {

example.run((a)=>{
create(a)
})

async function addUser() { 
example.run(a)=>{
readData(a)
}}

async function readData(val) {
app.post()
}

或RxJS库测试
第一个锁在它驻留的函数中锁定下面的代码,第二个不在then中等待
-----编辑
所有需要的东西都可以在这里找到https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/resolve.这是在概述标签中.这些是js的基础.

8mmmxcuj

8mmmxcuj2#

sqlite3节点模块概述

sqlite3模块为Node应用程序提供与SQLite数据库通信的函数。

数据库对象

sqlite3模块是**/database/db.js所必需的,**指定显示详细错误。

var sqlite3 = require('sqlite3').verbose();

然后使用上面初始化的数据库**/database/db. sqlite创建一个新的数据库对象。**

var db = new sqlite3.Database('./database/db.sqlite');

导出此对象(可用于需要此对象的其他脚本)。

module.exports = db;

使用数据库对象需要数据库对象的唯一脚本是数据模型/models/data-model.js.

var db = require('../database/db');

此对象的方法可以使用db.function()运行。
函数中的用法示例例如,Database.run()函数对数据库执行SQL命令,但不返回任何行。
run()函数的语法是:

Database.run(querystring, [parameters...], [callback])

在这个应用程序中,run()命令用于createRow()deleteRow()数据模型函数,它们充当单个db.run()调用的 Package 函数。

function createRow (table, cb) {
  let sql = `INSERT INTO ${table} DEFAULT VALUES`;
  db.run(sql, cb);
};

createRow()函数有两个参数:数据库中表的名称和回调函数。
请访问这个网站查看更多关于连接和如何处理link的详细信息

相关问题