新手问一下关于Nodejs异步返回值的问题

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

新手问一下关于Nodejs异步返回值的问题

因为项目用到 puppeteer 库要写一点 Node.js 代码
大概是 endpoint 调用 logic 的 do
do 里需要用到 aboutPuppeteerMethod 的返回值
但是没等到 aboutPuppeteerMethod 执行完返回 sth 已经先执行了 next
我理解的 async 类似于 golang 的 go 关键字 但是似乎没有找到 channel 配套
想达到在 aboutPuppeteerMethod 增加一个 channel 阻塞等待返回值继续执行后面代码的效果
不知道该怎么写 原来没写过 js 轻喷

function Logic() {}

Logic.prototype.do = function (param) {
  var sth = aboutPuppeteerMethod()

  var ok = next(sth, param)

  return ok
}

async function aboutPuppeteerMethod() {
  ....
  await page.goto()

  return sth
}


4 回复

Logic.prototype.do = async function (param) {
var sth = await aboutPuppeteerMethod()
var ok = next(sth, param)

return ok
}


用 await 来阻塞等待 async

谢谢 我已经找到办法了 一开始我是这么写 但是外层 endpoint 没有这么写 所以 client 才获取不到返回值 感谢

你好,关于Node.js中的异步返回值问题,这是一个非常常见的疑问。Node.js是基于事件驱动和非阻塞I/O模型的,因此很多操作都是异步进行的。这就意味着你不能直接通过返回值来获取异步操作的结果,而需要使用回调函数、Promises或者async/await来处理。

下面我将通过代码展示这三种方法:

1. 回调函数

function asyncOperation(callback) {
    setTimeout(() => {
        callback(null, 'Result from async operation');
    }, 1000);
}

asyncOperation((err, result) => {
    if (err) {
        console.error(err);
    } else {
        console.log(result);
    }
});

2. Promises

function asyncOperation() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('Result from async operation');
        }, 1000);
    });
}

asyncOperation().then(result => {
    console.log(result);
}).catch(err => {
    console.error(err);
});

3. async/await

function asyncOperation() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('Result from async operation');
        }, 1000);
    });
}

async function main() {
    try {
        const result = await asyncOperation();
        console.log(result);
    } catch (err) {
        console.error(err);
    }
}

main();

希望这些示例能帮助你理解如何在Node.js中处理异步返回值。如果有其他问题,欢迎继续提问!

回到顶部