Nodejs 新手,请问怎么在一个函数里等 promise 执行了 resolve() 之后才返回呢

发布于 1周前 作者 nodeper 来自 nodejs/Nestjs

Nodejs 新手,请问怎么在一个函数里等 promise 执行了 resolve() 之后才返回呢
null

14 回复

直接返回 promise


es7 async await

这不就是同步执行么?

还用什么 Promise ?

callback, promise, rx, async/await 任君选择

好像只能回调,或者看下是否已支持 await





正在练手 koa ,用了 npm 里一个 google translate 的包,它返回的就是一个 promise ,我想把这个 promise 的结果传给 koa 路由,然后就不知道了。。。

promise 不是有 then 么,把后续逻辑写在 then 里边不就好了, poorman’s await 。

路由就是 async 的,或者如果是 koa 1 那么就是 generator ,都支持异步。

给你个例子吧:

比如这个 controller :

koa1:
js<br>a: function() * {<br> const result = yield fetchTranslate();<br><br> this.data = result;<br>}<br>

koa 2:

js<br>async a(ctx, next) {<br> const result = await fetchTranslate();<br><br> ctx.data = result;<br>}<br>

没测试,可能有语法错误,大概就是这么个意思。

function fn() {
return new Promise((resolve, reject) => {
// do something
resolve()
})
}

异步是会传染的,最好 async 其次 co+generator ,或者把这个函数也 promise 化返回,最次 callback

非常感谢,你的代码解决了我的问题。可是我还是没有弄懂 koa 为什么会自动执行 promise 里的 resolve(),希望能帮帮我,谢谢

因为 async 会创建一个异步函数,这时候如果在 promise 前加上 await 那么就会等待这个 promise 完成再继续执行。
generator 同理。不过 generator 先出现,但是因为 async/await 是 ES7 的东西,所以大家都跳过 generator 直接用上了 async/await.

这两个概念理解起来可能有点费劲,具体你可以找一些文章来学习一下 async/await 和 generator 。比如 https://ponyfoo.com/articles/understanding-javascript-async-await

函数里不能等 promise resolve 之后再返回,但是可以在 resolve 执行之前返回这个 promise 对象,让调用这个函数的程序拿到返回的 promise 再调用其 then 等方法拿到回调函数。
javascript<br>function f() { <br> return new Promise((resolve, reject) =&gt; { <br> // 做其他事<br> resolve();<br> }) ;<br>}<br><br>let thePromise=f();// 这一句是执行 f 函数,返回了一个 Promise 对象,复制给 thePromise 变量<br>thePromise.then(function(){<br> // 这里就是在 f 函数的 resolve 执行完之后才执行的程序。<br>});<br>

作为Node.js新手,理解如何等待Promise执行完成并获取其结果是非常重要的。在JavaScript中,你可以使用asyncawait关键字来优雅地处理异步操作。

以下是一个简单的示例,展示如何在函数内部等待Promise执行完成后再返回结果:

// 定义一个返回Promise的函数
function asyncOperation() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("操作完成!");
        }, 2000); // 模拟2秒的异步操作
    });
}

// 使用async和await来等待Promise完成
async function waitForAsyncOperation() {
    try {
        const result = await asyncOperation(); // 等待Promise完成
        return result; // 返回Promise的结果
    } catch (error) {
        console.error("发生错误:", error);
    }
}

// 调用函数并处理结果
waitForAsyncOperation().then(result => {
    console.log(result); // 输出: 操作完成!
});

在这个例子中,asyncOperation函数返回一个在2秒后解决的Promise。waitForAsyncOperation函数使用async关键字标记为异步函数,并使用await关键字等待asyncOperation的结果。这样,waitForAsyncOperation函数会在Promise解决后才返回结果。

asyncawait使得异步代码看起来更像是同步代码,从而使代码更易于理解和维护。记住,await只能在async函数内部使用。

回到顶部