Javascript 从另一个承诺中返回一个承诺

Javascript 从另一个承诺中返回一个承诺,javascript,node.js,promise,es6-promise,firefox-addon-webextensions,Javascript,Node.js,Promise,Es6 Promise,Firefox Addon Webextensions,我在这方面有点生疏。请帮忙 我试图从函数返回一个承诺。这似乎很有效,直到我尝试在现有承诺的基础上回报承诺 我正试图在FireFox扩展中实现这一点。下面的代码是为node.js编写的,因为我认为它可能会给出更多解释。我不知道该怎么做 函数topLevel调用函数level2。level2等待承诺的解决,然后将承诺返回给level1。level1登录到它的。然后 level2在解决其内部承诺后调用level3并返回新承诺 在本例中,所有承诺都会立即解决。这个例子是按要点配对的 function t

我在这方面有点生疏。请帮忙

我试图从函数返回一个承诺。这似乎很有效,直到我尝试在现有承诺的基础上回报承诺

我正试图在FireFox扩展中实现这一点。下面的代码是为node.js编写的,因为我认为它可能会给出更多解释。我不知道该怎么做

函数topLevel调用函数level2。level2等待承诺的解决,然后将承诺返回给level1。level1登录到它的。然后

level2在解决其内部承诺后调用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”,它改变了级别2的行为。当设置为“true”时,level2将等待承诺并在该承诺语句中返回level3的承诺。level3已运行,但level1中的console.log从未执行,并导致错误。当设置为false时,一切正常(level3中的承诺直接返回,而不是在.then中返回)。错误是无法读取toplevel中未定义的属性“then”。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未定义”。同样,登录level1从未发生过


有什么方法可以让它工作吗?我需要依赖这个模式,当
testError
为true时,level2不会返回任何内容

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

改为

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

您需要
返回
level2
函数中创建的
新承诺

我认为这很简单,只需在第12行的
新承诺之前添加一个
返回

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");
  }));
}

这就成功了。感谢所有回答的人。我使用wait进行了一次“变通”,但在其他方面尝试了这种方法,但它不起作用。