我正在使用节点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);
}
问题是函数在返回我不想要的控件之前等待地址。(或者,由于函数是异步的,所以它没有任何区别。在我的例子中,性能是一个很大的标准)
当你想返回父对象的承诺,而你的父对象却依赖于子对象的承诺时,如何处理这种承诺依赖。
谢谢.
使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