从那时起返回另一个承诺的承诺

returning a promise from the then of another promise

我对此有点陌生。请帮助

我正在尝试 return 来自函数的承诺。在我尝试 return 现有承诺的承诺之前,这似乎运作良好。

我正在尝试在 FireFox 扩展中执行此操作。下面的代码是为 node.js 编写的,因为我认为它可能会提供更多解释。我不知道如何让它工作。

函数 topLevel 调用函数 level2。 level2 等待 promise 解决,然后 return 向 level1 发送一个 promise。级别 1 登录其 .then.

level2 在其内部 promise 得到解决并且 returns 一个新的 promise

后调用 level3

在示例中,所有承诺都会立即解决。该示例与要点配对

function topLevel() {
  level2()
  .then(() => {
      console.log("topLevel resolved")
    })
}

let testError=true;

function level2() {
  if(testError) {
    new Promise((resolve, reject) => {
      resolve("Level 2");
    })
      .then(() => {
        return (level3());
      })
  }
  else {
    return (level3());
  }
}


function level3(){
  return (new Promise((resolve, reject) => {
    resolve("Level 3");
  }));


}


topLevel();

有一个变量 "testError" 可以改变 level 2 的行为。当设置为 "true" 时,level2 会等待一个 promise 并且 return 在那个 promises then 语句中是来自 level3 的一个 promise . level3 是 运行 但 level1 中的 console.log 永远不会执行并导致错误。当设置为 false 时,一切正常(来自 level3 的承诺是直接 returned 而不是在.then 中。错误是 Cannot read 属性 'then' of undefined in toplevel .then.

来自后台脚本的 firefox webextension 代码如下

browser.browserAction.onClicked.addListener(topLevel);


function topLevel() {
  level2()
  .then(() => {
      console.log("topLevel resolved")
    })
}


function level2() {
  new Promise((resolve, reject) => {
    resolve("Level 2");
  })
    .then(() => {
      return (level3());
    })
}


function level3(){

  return (new Promise((resolve, reject) => {
    resolve("Level 3");
  }));


}

它会在 .then 和 return 语句之间的 level2 中引起警告 "level2 is undefined"。并且一级登录永远不会发生。

有什么方法可以让它工作吗??我需要依赖这个模式

testError 为真时,

level2 不会 return 任何东西。

thenable(给then的函数)是一个函数。 thenable 中的 return 语句只涉及 thenable 本身(就像任何函数一样)。

改为

function level2() {
  if (testError) {
    return new Promise((resolve, reject) => {
      resolve("Level 2");
    }).then(() => {
      return level3();
    });
  }
  return level3();
}

您需要 return 您在 level2 函数中创建的 new Promise

我觉得很简单,就是在第12行的new Promise...之前加一个return。修改后的代码:

function topLevel() {
  level2()
  .then(() => {
    console.log("topLevel resolved")
  })
}

let testError = true;

function level2() {
  if(testError) {
    // Added "return" here
    return new Promise((resolve, reject) => {
      resolve("Level 2");
    })
    .then(() => {
      return (level3());
    })
  }
  else {
    return (level3());
  }
}

function level3() {
  return (new Promise((resolve, reject) => {
    resolve("Level 3");
  }));
}