从当时的另一个承诺中回复承诺

时间:2018-02-14 19:55:22

标签: javascript node.js promise es6-promise firefox-webextensions

我对此有点新意。请帮忙

我正在尝试从函数返回一个promise。这似乎很有效,直到我试图在现有的承诺中返回承诺。

我正在尝试在FireFox扩展程序中执行此操作。下面的代码是为node.js编写的,因为我认为它可能会给出更多解释。我无法弄清楚如何使它发挥作用。

function topLevel调用函数level2。 level2等待解析的承诺,然后将promise返回给level1。 level1登录.then。

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等待promise并在promises then语句中返回level3中的promise。 level3已运行但level1中的console.log永远不会执行,并且会产生错误。当设置为false时,一切正常(来自level3的保证直接返回而不是.then。错误是无法读取属性'然后在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未定义"。并且第一级登录永远不会发生。

任何使这项工作的方法?我需要依赖这种模式

3 个答案:

答案 0 :(得分:2)

<level2testError时,

then不会返回任何内容。

thenable(赋予function level2() { if (testError) { return new Promise((resolve, reject) => { resolve("Level 2"); }).then(() => { return level3(); }); } return level3(); } 的函数)是一个函数。在thenable中的return语句只涉及thenable本身(就像任何函数一样)。

更改为

var objList = [{variantId: "1111", quantity: 2},
{variantId: "222222", quantity: 2},
{variantId: "333333", quantity: 2},
{variantId: "44444", quantity: 1}]

答案 1 :(得分:1)

我认为这就像在第12行environment: 之前添加return一样简单。修改后的代码:

new Promise...

答案 2 :(得分:0)

您需要returnnew Promise函数中创建的level2