我对此有点新意。请帮忙
我正在尝试从函数返回一个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未定义"。并且第一级登录永远不会发生。
任何使这项工作的方法?我需要依赖这种模式
答案 0 :(得分:2)
level2
为testError
时, 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)
您需要return
在new Promise
函数中创建的level2
。