我正在使用一个名为bugout(基于webtorrent的API)的库来创建P2P房间,但我需要它根据使用Dexie进行的表查找中的值来创建房间。

我知道在Stack Overflow上已经对此进行了100万次修改,但是我仍然难以理解promise或async await函数的概念。在此值可用之前,我需要Bugout操作才能继续进行。但是我也不想陷入回调地狱。

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而使用诺言,请执行以下操作:

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


这两个功能完全相同。他们中的任何一个都会依次返回一个承诺,所以当您调用它时。因此,无论要使用检索到的Bugout实例做什么,都需要以与Dexie的诺言相同的方式处理诺言,即您自己的函数将返回。

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


或者,如果您不想使用异步/等待:

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

关于javascript - 等待对Dexie表查找的响应,然后继续,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58870376/

10-09 22:39