当前位置: 首页 > 知识库问答 >
问题:

在nodejs的函数中返回一个promise而不等待依赖promise

姬锐
2023-03-14

我正在使用节点8.x。因此,我可以访问所有最新的特性,如异步/等待等。

该场景类似于以下内容(语法不正确,仅供解释):

createUser()
{
    let userAddress = createAddress(); // Aync, returns a promise
    User.create(name: 'foo', address: userAddress); // User creation is dependant on address. Also, User.create returns a promise.
}

基本上,User对象的创建依赖于address对象的创建。我希望createUser函数异步执行,即尽快返回一个promise而不等待address对象的创建。

这个问题的目的不是完成任务,而是了解在异步编程中解决这类问题的最佳方法是什么。

我能想到的方法不多:1:创建一个新的promise对象,并在createUser函数中输入时立即返回。在创建user对象时进行解析。2:使createUser成为一个异步函数,然后返回user promise。使用这种方法面临的问题:

async function createUser()
{
    address = await createAddress();
    return User.create(name: 'foo', address: userAddress);
}

问题是函数在返回我不想要的控件之前等待地址。(或者,由于函数是异步的,所以它没有任何区别。在我的例子中,性能是一个很大的标准)

当你想返回父对象的承诺,而你的父对象却依赖于子对象的承诺时,如何处理这种承诺依赖。

谢谢.

共有2个答案

孔波
2023-03-14

您可以按原样编写函数,然后取决于如何调用它。您不能使用await,因为它在当前作用域中阻塞。您可以使用引入一个新的作用域。但是:

async function createUser() {
  address = await createAddress();
  return User.create({ name: 'foo', address });
}
...
createUser().then(() => { /* handle user creation */ });
// code here will not wait for `createUser` to finish
章哲茂
2023-03-14

使createUser成为一个异步函数,然后返回user promise。问题是函数在返回我不想要的控件之前等待地址。

不,不是。异步函数会立即向其调用方返回一个承诺。它只在执行其主体中的代码时等待(并在return时解析承诺)。您的代码可以工作,这正是您应该做的。

 类似资料:
  • 考虑以下代码: 这是我得到的输出: 但是如果我把代码改成这样: 我会得到这个: 我很困惑,因为根据文档,应该暂停执行,直到promise得到解决。在这种情况下,第一个示例应该以数组的形式返回

  • 我试图利用es7异步功能,即。 在这里,所有promise*函数都进行ajax调用,并返回或如果ajax响应满足传递的参数,我相信我不能连续使用3个等待,因此需要一种方法来等待所有这些调用以某种方式返回它们的值。

  • 我仍在为承诺而挣扎,但多亏了这里的社区,我取得了一些进步。 我有一个简单的JS函数,它查询解析数据库。它应该返回结果数组,但显然由于查询的异步性质(因此有承诺),函数在结果之前返回,给我留下一个未定义的数组。 我需要做什么才能让这个函数等待承诺的结果呢? 这是我的代码:

  • 我有一个包含100个promise的promise数组。我想等待,直到一个promise以真实的价值实现。另外,我想确保只有x个promise同时运行(设置限制)。 我已经研究了像和这样的方法,但是它们没有并发选项。 我该怎么做呢?

  • 我试图了解异步/等待如何与promise一起工作。 据我所知,await应该是阻塞的,在上面的代码中,它似乎阻塞了返回带有原语

  • 我看了类似的问题,没有找到一个解决方案,我可以实现到我自己的代码,因此我做了这篇文章。我有以下代码: 最后一个console.log返回undefined,尽管pool.query中的console日志提供了我要查找的正确字符串。我尝试过的这段代码的另一个版本给出了暂挂的promise,而不是未定义的promise。 通过阅读其他文章,我理解这是因为我没有将wait与async函数一起使用。问题是