JavaScript承诺和设置超时
我一直在玩弄承诺,但我很难理解以下代码发生了什么:JavaScript承诺和设置超时,javascript,es6-promise,Javascript,Es6 Promise,我一直在玩弄承诺,但我很难理解以下代码发生了什么: function a() { return new Promise(function (resolve, reject) { resolve("hi from a!"); }); } function b() { return new Promise(function (resolve, reject) { setTimeout(function () {
function a() {
return new Promise(function (resolve, reject) {
resolve("hi from a!");
});
}
function b() {
return new Promise(function (resolve, reject) {
setTimeout(function () {
resolve("hi from b!");
}, 5000);
});
}
function c() {
return new Promise(function (resolve, reject) {
setTimeout(function () {
resolve("hi from c!");
}, 1000);
});
}
a().then(function (resultFromA) {
console.log("a() responded with: " + resultFromA);
b();
}).then(function (resultFromB) {
console.log("b() responded with: " + resultFromB);
c();
}).then(function (resultFromC) {
console.log("c() responded with: " + resultFromC);
});
我希望这个输出a()的响应是:hifrom a
立即,连同b()一起响应:hi from b代码>和c()的响应是:嗨,来自c在它们各自的setTimeout()激发后进行编码>。然而,我得到的是以下立即输出:
a()的回答是:a你好
b()的响应为:未定义
c()的响应为:未定义
我以为.then()
会等待这些承诺,但事实并非如此。任何帮助都将不胜感激。您需要从处理程序中返回b()
和返回c()
然后
仅将第一个承诺“替换”为从其回调返回的后续承诺
如果then
回调未返回
承诺,则then
将应用于原始承诺,并且无论上一次then
回调的内容/结果如何,它都将立即执行
基本上
a().then(function () {
b()
}).then( # This "then" is chained off of a's promise
反之:
a().then(function () {
return b()
}).then( # This "then" is chained off of b's promise
您需要返回承诺
以链接承诺:
a().then(function (resultFromA) {
console.log("a() responded with: " + resultFromA);
// return b() promise
return b();
}).then(function (resultFromB) {
console.log("b() responded with: " + resultFromB);
// return c() promise
return c();
}).then(function (resultFromC) {
console.log("c() responded with: " + resultFromC);
});
您忘记从函数调用返回。Javascript函数不会隐式返回
function a() {
return new Promise(function (resolve, reject) {
resolve("hi from a!");
});
}
function b() {
return new Promise(function (resolve, reject) {
setTimeout(function () {
resolve("hi from b!");
}, 5000);
});
}
function c() {
return new Promise(function (resolve, reject) {
setTimeout(function () {
resolve("hi from c!");
}, 1000);
});
}
a().then(function (resultFromA) {
console.log("a() responded with: " + resultFromA);
return b(); // return
}).then(function (resultFromB) {
console.log("b() responded with: " + resultFromB);
return c(); // return
}).then(function (resultFromC) {
console.log("c() responded with: " + resultFromC);
});
我的问题是,出于某种原因,我认为then
等待本地范围内的所有承诺来解决,而实际上只有return
ed一个。我最初没有尝试执行return b()
或return c()
“Javascript函数不会隐式返回。”这不完全正确。当主体是单个表达式时,箭头函数确实隐式返回:这种解释不正确。'then()`函数总是返回一个新的承诺。但是,在上述情况下(b()
),函数的返回值是undefined
,它被包装在一个新的承诺中。看起来第二个promise与a()
promise链接在一起,因为.then()
函数的主体是同步完成的,因此随后立即完成。