Javascript 需要理解为什么内联函数的承诺结果不能解析为预期的返回结果

Javascript 需要理解为什么内联函数的承诺结果不能解析为预期的返回结果,javascript,node.js,asynchronous,promise,Javascript,Node.js,Asynchronous,Promise,我正在学习更多关于JavaScript承诺的知识,在尝试将不同函数中的一些承诺逻辑组合到单个内联函数中时遇到了一个问题。当我将其全部拉入一个内联函数时,它将导致承诺返回结果的“未定义”值,而不是预期的“世界”值 [按预期工作,异步解析承诺,并为承诺响应生成“world”] app.get('/asyncTest', (request, response) => { console.log("Request started..."); var helloResult = h

我正在学习更多关于JavaScript承诺的知识,在尝试将不同函数中的一些承诺逻辑组合到单个内联函数中时遇到了一个问题。当我将其全部拉入一个内联函数时,它将导致承诺返回结果的“未定义”值,而不是预期的“世界”值

[按预期工作,异步解析承诺,并为承诺响应生成“world”]

app.get('/asyncTest', (request, response) => {
    console.log("Request started...");

    var helloResult = hello()
            .then((res)=> {
                console.log('COMPLETED Promise Result (Promise completed): ' + res)
            });

    console.log('Hello Result (immediately after issuing the promise [still in promise object format]): ' + helloResult);

    console.log('Mesage at the end of the request (Should fire before completion of the promise result being fulfilled...');
});


function wait(ms) {
    return new Promise(r => setTimeout(r, ms));
}

async function hello() {
    await wait(3000);
    return 'world';
}
[不起作用-导致承诺响应的“未定义”而不是“世界…”

var helloResult = async (r) => { 
                await new Promise(r => {
                    setTimeout(r, 3000);
                    return 'world';
                })
            };

let helloResponse = helloResult().then((res)=> {
    console.log('COMPLETED Promise Result (Promise completed): ' + res)
})
[不起作用-导致承诺响应的“未定义”而不是“世界…”

var helloResult = async () => { 
                await new Promise(r => {
                    setTimeout(r, 3000);
                    return 'world';
                })
                .then((responseData)=> {
                    console.log('COMPLETED Promise Result (Promise completed): ' + responseData)
                })};
出于某种原因,后2次尝试更改代码中的承诺会导致“undefined”,而不是返回结果“world”中的预期值


非常感谢您的帮助。

在后面的示例中,您将从
Promise
构造函数回调返回。该值未解析。您必须调用
resolve
回调才能传递值

await new Promise(r => {
   setTimeout(() => r('world'), 3000);
});

您应该能够通过在承诺中使用
resolve
来解决此问题,如下所示:

var helloResult = async (r) => { 
                await new Promise(r => {
                    setTimeout(r, 3000);
                    resolve('world');
                })
            };

let helloResponse = helloResult().then((res)=> {
    console.log('COMPLETED Promise Result (Promise completed): ' + res)
})

类似地,可以对第二个代码块执行此操作,其中您已将
链接到承诺上。

您在
helloResult()
中没有
返回
,需要将参数传递到
resolve()

var helloResult=async(r)=>{
返回等待新承诺(r=>{
设置超时(r,500,“世界”);
})
};
让helloreresponse=helloResult()。然后((res)=>{
console.log('已完成承诺结果(承诺已完成):'+res)
})
我看到了混乱

new Promise((resolve, reject) => {
  resolve(1);
  return 2;
}).then(v => console.assert(v===1))
在promise构造函数中,您可以返回一个值,但它会被忽略。沿链传递的值是传递给
resolve
reject
函数的值。所以当你这样做的时候:

var helloResult = async (r) => { 
  await new Promise(r => {
    setTimeout(r, 3000);
    return 'world';
  })
};
这是相同的概念
setTimeout
在正确的时间调用
resolve
r
),但不传入值(“world”)。在您的情况下,您有两个选项,两者基本上做相同的事情:

var helloResult = async (r) => 
  await new Promise(r => {
    setTimeout(r, 3000, 'world');
  });

// or 

var helloResult = async (r) =>
  await new Promise(r => {
    setTimeout(()=> r('world'), 3000);
  });

在第二个示例中:
then
是Promise API上的一个方法,因此您需要从
helloResult
返回一个Promise,以使其生效。一旦超时完成,您也不会解决该承诺

var helloResult=()=>{
返回新承诺(解决=>{
setTimeout(()=>resolve('world'),3000);
});
};
让helloreresponse=helloResult()。然后((res)=>{
console.log('已完成承诺结果(承诺已完成):'+res)

})
async
首先应该在
get
回调中(
async(请求、响应)=>{
),如果您计划在
helloResult
上保留承诺响应值。只要父回调未标记为
async
,将内部内容包装在
async
中就不会有任何效果。不,承诺将等待所有调用的操作完成后再解析。我认为这不对。此代码不运行ei太好了!谢谢@Daniel,我真的很感激,这正是我错过的。