提问者:小点点

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


我正在使用节点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个答案

匿名用户

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

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

匿名用户

您可以按原样编写函数,然后取决于如何调用它。您不能使用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