Javascript 从另一个承诺中返回一个承诺
我在这方面有点生疏。请帮忙 我试图从函数返回一个承诺。这似乎很有效,直到我尝试在现有承诺的基础上回报承诺 我正试图在FireFox扩展中实现这一点。下面的代码是为node.js编写的,因为我认为它可能会给出更多解释。我不知道该怎么做 函数topLevel调用函数level2。level2等待承诺的解决,然后将承诺返回给level1。level1登录到它的。然后 level2在解决其内部承诺后调用level3并返回新承诺 在本例中,所有承诺都会立即解决。这个例子是按要点配对的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
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进行了一次“变通”,但在其他方面尝试了这种方法,但它不起作用。