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

Posted

技术标签:

【中文标题】返回一个等待的值返回一个 Promise? (es7 异步/等待)【英文标题】:Returning an awaited value returns a Promise? (es7 async/await) 【发布时间】:2017-02-10 06:29:43 【问题描述】:
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 预设来编译它。

【问题讨论】:

因为它是异步函数。这就是异步函数和普通函数的区别。 我认为您可以从异步函数内部获得异步/等待的好处。如果您在 wrapper() 函数内或任何其他 async 函数内 console.log(someString),您将获得 somestring 值。 @estus 那么为什么在等待someString 输出正确的值后立即记录呢? @Gobliins:不,它是 ES2017 (ES8) 的一部分。 @FelixKling 你是对的,我错误地认为 ES2017 == ES7 【参考方案1】:

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

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

    return Promise.resolve(somevalue)

IMO async await 关键字需要多一个,解决

写出来就好了 返回解决'你好'

或者只是

resolve 'hello'

【讨论】:

好吧,同时我发现你可以从异步方法中返回一个变量,这与使用变量调用解析相同【参考方案2】:

异步函数返回承诺。为了做你想做的事,试试这样的事情

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

您也可以在 wrapper() 上等待,就像其他异步函数上下文中的其他承诺一样。

console.log(await wrapper());

【讨论】:

你确定那里的第二个例子?我得到了语法错误。 @JakeWilson 它必须在异步函数中。 developer.mozilla.org/en-US/docs/Web/javascript/Reference/…

以上是关于返回一个等待的值返回一个 Promise? (es7 异步/等待)的主要内容,如果未能解决你的问题,请参考以下文章

理解ES7中的async/await

ES6(十三)Promise

我不能使用从 promise 返回的值

等待 Promise 返回的第一个 true 的干净方式

解决"回调地狱"的发展过程

ES6 Promise