如何使用 nodejs 将值传递给另一个函数?

Posted

技术标签:

【中文标题】如何使用 nodejs 将值传递给另一个函数?【英文标题】:How would I pass down a value to another function with nodejs? 【发布时间】:2021-01-12 08:56:43 【问题描述】:

所以,我正在尝试用 discord js 和 sqlite3 做一个事情,但在过去的几个小时里我一直被困在这个问题上,我仍然不明白我将如何解决它。

  client.countDB = function(discordID) 
    const arr = [];
    db.each(`SELECT count(DiscordID) FROM verification WHERE DiscordID = $discordID`, function(err, row)
      if(err)console.log(err); return 0;
      arr.push(Object.values(row))
      return arr;
    )
    return arr[0];
  ;

所以我试图获取仅在 db.each 中可用的数据,但我不知道如何将其传递出去,以便返回预期值。我已经尝试过使用全局变量,将其放在更大的范围内,但我仍然不知道该怎么做。

抱歉,我不习惯一直问问题。

编辑:应该说我正在使用npm sqlite3 模块。 https://www.npmjs.com/package/sqlite3

【问题讨论】:

你得到undefined arr[0] 的值了吗? 这显然行不通,因为你的return 语句会在db.each 的回调执行之前触发。我对 sqlite3 不熟悉,但必须有一种方法可以通过开箱即用的承诺来获得 db.each 的结果。如果没有,您将不得不自己承诺。 是的,正是我的想法,使用async await,他们在github中提到github.com/mapbox/node-sqlite3确实是异步的。 它可能是异步的,但它在这里或API Docs 中没有提到它返回一个承诺,也没有提到如果没有通过回调它将返回一个承诺(通常是这种情况使用此类库) @shubhamjha 抱歉回复晚了,但是是的,我得到了一个未定义的值 【参考方案1】:

将您的代码包装在一个函数中以使其同步,reference

var deasync = require('deasync');

function syncFunc()


    let arr;
    client.countDB = function(discordID) 
        db.each(`SELECT count(DiscordID) FROM verification WHERE DiscordID = $discordID`, function(err, row)
          if(err)console.log(err); arr = null;return;
          const tmp = []
          tmp.push(Object.values(row))
          arr = tmp;
        )
      ;
    while((arr === undefined))
    
         deasync.runLoopOnce();
    
    return arr[0];

【讨论】:

感谢您的回复,但运行时未定义。 感谢您的帮助,但这不起作用,因为我需要在 client.countDB 中的功能【参考方案2】:

如果您有查询中的数据,最简单的方法是使用 Promise。

client.countDB = function(discordID) 
 return new Promise((resolve, reject) => 
  db.each(`SELECT count(DiscordID) FROM verification WHERE DiscordID = $discordID`, function(err, row)
    //if you want to throw as an error, reject promise with the incoming error as "reject(err)"
    if(err)console.log(err); return resolve(0);
    arr.push(Object.values(row))
    return resolve(arr[0]);
  )
 );

// You can use this as 
client.countDB('someId')
 .then(data => console.log(data))
 .catch(err => console.log(err));

【讨论】:

以上是关于如何使用 nodejs 将值传递给另一个函数?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:如何将值从 streamprovider / listview builder 传递给另一个类

将值传递给另一个组件

将值传递给另一个类

如何将值从动态列表视图传递到活动?

将值传递给另一个UIViewController

如何将值从列表视图传递到 detalis Activity