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()的响应是:嗨,来自csetTimeout()激发后进行编码>。然而,我得到的是以下立即输出:

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()
函数的主体是同步完成的,因此随后立即完成。