返回一个已等待的值会返回一个Promise吗?(es7异步/等待)

17
const ret = () => new Promise(resolve => setTimeout( () => resolve('somestring'), 1000));

async function wrapper() {
    let someString = await ret();
    return someString;
}

console.log( wrapper() );

它记录Promise { <pending> }; 为什么返回一个 Promise 而不是 'somestring'

我正在使用 Babel ES7 预设进行编译。


因为它是异步函数,这就是异步函数和普通函数之间的区别。 - Estus Flask
我认为你可以从异步函数内部获得async/await的好处。如果你在wrapper()函数或任何其他async函数内部使用console.log(someString),你将获得someString的值。 - Diego Cardoso
@estus 那为什么在等待之后立即记录someString,输出的值却是正确的? - bool3max
1
@Gobliins:不,它是ES2017(ES8)的一部分。 - Felix Kling
1
@FelixKling 您是正确的,我错误地假设 ES2017 == ES7。 - Gobliins
显示剩余4条评论
2个回答

20

异步函数返回 Promise。为了实现你想要的功能,可以尝试像这样:

wrapper().then(someString => console.log(someString));

你也可以像其他promise一样在另一个async函数的上下文中等待wrapper()

console.log(await wrapper());

你确定第二个例子没问题吗?我用那个会出现语法错误。 - Jake Wilson
@JakeWilson 它必须在异步函数内部。https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/await#Examples - afuous

2

如果你希望异步函数立即返回一个值,你可以使用Promise.resolve(theValue)

async waitForSomething() {
    const somevalue = await waitForSomethingElse()
    console.log(somevalue)

    return Promise.resolve(somevalue)
}

在我看来,async和await关键字还需要一个resolve关键字。

这样写会更好些:

return resolve 'hello'

或者只需:

resolve 'hello'
resolve 'hello'

好的,在此期间我已经发现,您可以从异步方法中返回一个变量,这与使用resolve并传递该变量的效果相同。 - Martijn Scheffer
1
这是错误的答案,“如果你想让你的异步函数立即返回一个值”,无论如何,异步函数总是返回一个 Promise。 - Qiulang
resolve 'hello' 这根本不是有效的 JavaScript 代码。我很奇怪这个回答为什么会被点赞。 - Bergi
@Bergi没错!这就是为什么我也写了一个回答。 - Qiulang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接