在继续之前等待对 Dexie table 查找的响应

Wait for a response to a Dexie table lookup before proceeding

我正在使用一个名为 bugout 的库(它是一个 API 建立在 webtorrent 上)来创建一个 P2P 房间,但我需要它来根据 table 的值创建房间使用 Dexie 查找。

我知道这已在 Stack Overflow 上重复了一百万次,但我仍然无法理解 promises 或异步等待函数的概念。在该值可用之前,我需要错误操作才能继续。但我也不想陷入回调地狱。

var room = db.profile.get(0, function (profile) {var ffname = profile.firstName;return ffname})
console.log(ffname) //returns undefined
var b = new Bugout(ffname);

我也试过:

var room = db.profile.get(0, function (profile) {var ffname = profile.firstName;return ffname})
console.log(room) //returns undefined
var b = new Bugout(room);

我怎样才能用尽可能少的代码取回 ffname 而不会陷入一堆匿名或异步函数中,这些函数会将我锁定在 API 之外?

最简单最简单的方法是这样的:

async function getBugoutFromId(id) {
  var profile = await db.profile.get(id);
  var ffname = profile.firstName;
  console.log(ffname)
  var b = new Bugout(ffname);
  return b;
}

如果您更喜欢在不使用 async/await 的情况下使用 promises,请执行以下操作:

function getBugoutFromId(id) {
  return db.profile.get(id).then(profile => {        
    var ffname = profile.firstName;
    console.log(ffname)
    var b = new Bugout(ffname);
    return b;
  });
}

这两个函数的工作原理相同。它们中的任何一个 returns 依次是一个 promise,所以当你调用它时。因此,无论您要对检索到的 Bugout 实例做什么,都需要以与处理 Dexie 的承诺相同的方式处理您自己的函数 returns 的承诺。

async function someOtherFunction() {
   var bugout = await getBugoutFromId(0);
   console.log ("Yeah! I have a bugout", bugout);
}

或者如果您不想使用 async/await:

function someOtherFunction() {
   return getBugoutFromId(0).then(bugout => {
     console.log ("Year! I have a bugout", bugout);
   });
}