NodeJS,从 promise 链到 async/await 链
NodeJS, from promise chaining to async/await chaining
使用 NodeJS version 16.14.0
我正在尝试从 promise .then().catch
迁移到 async/await
管理。
问题是,使用第一种方法,我能够按顺序链接多个函数,每个函数都传递相同的大对象(return resolve(bigObject)
并且每个函数都将相同的 bigObject
作为输入)。我这样做是因为我能够管理数据内部的微错误(因此不涉及捕获),向用户返回完整的错误列表:
var commonData = {
data1: ...
data2: ...
data3: ...
data4: ...
data5: ...
data6: ...
};
return function1(commonData)
.then(function2)
.then(function3)
.then(function4)
.then(function5)
.then(function(result) {
//Inside this .then, I'd have the "result" variable as result of the chain
})
.catch(error => { return reject(error); });
如何使用异步等待系统来实现?这是我到目前为止尝试过的:
var commonData = {
data1: ...
data2: ...
data3: ...
data4: ...
data5: ...
data6: ...
};
commonData = await function1(commonData);
commonData = await function2(commonData);
commonData = await function3(commonData);
commonData = await function4(commonData);
commonData = await function5(commonData);
//I was expecting to have inside "commonData" the same situation
//as "result" in the chain above
是否有另一种方法可以将函数与我所缺少的相同的大对象链接在一起?
编辑:
我在这部分使用的 2 个函数...它们是这样设计的,因为它们也在文件的其他部分被调用,我无法在本地使用它们
//function 1
async function function1(commonData) {
try {
var data1 = await models.data1.findAll({where: {Domain_ID: [13,15]}})
data1.forEach(function(dat) {
commonData.data1.push(dat.dataValues);
});
return commonData;
} catch (error) {
throw error;
}
}
//function2
async function function2(commonData) {
try {
var data2 = await models.data2.findAll();
data2.forEach(function(dat) {
commonData.data2.push(dat.dataValues);
});
return commonData;
} catch (error) {
throw error;
}
}
不,没有别的办法。
实施 Async/Await 的原因之一是 Promise 链接看起来非常丑陋和混乱。如果您更喜欢 .then()
,请在本模块中坚持使用它。
进一步阅读:https://blog.logrocket.com/promise-chaining-is-dead-long-live-async-await-445897870abc/
您的方式(commonData = await function1(commonData)
等)很好。但如果你不想这样做,你可以嵌套调用:
const result = await function5(
await function4(
await function3(
await function2(
await function1(commonData)
)
)
)
);
或者使用循环:
let result = commonData;
for (const fn of [function1, function2, function3, function4, function5]) {
result = await fn(result);
}
或者您可以继续使用 then
。虽然通常通过 .then
/.catch
将 async
/await
与显式 promise 处理程序混合在一起会令人困惑,但在某些有限的时间你可以这样做:
const result = await function1(commonData)
.then(function2)
.then(function3)
.then(function4)
.then(function5);
之所以有效,是因为 async
函数只是一种消费和产生承诺的方式。
或者 非常重要的警告 你知道这些函数只修改对象的 状态 而不会 return(用)一个不同的对象(履行他们的承诺),你可以这样做:
await function1(commonData);
await function2(commonData);
await function3(commonData);
await function4(commonData);
const result = await function5(commonData);
但这是一个很大的警告。
使用 NodeJS version 16.14.0
我正在尝试从 promise .then().catch
迁移到 async/await
管理。
问题是,使用第一种方法,我能够按顺序链接多个函数,每个函数都传递相同的大对象(return resolve(bigObject)
并且每个函数都将相同的 bigObject
作为输入)。我这样做是因为我能够管理数据内部的微错误(因此不涉及捕获),向用户返回完整的错误列表:
var commonData = {
data1: ...
data2: ...
data3: ...
data4: ...
data5: ...
data6: ...
};
return function1(commonData)
.then(function2)
.then(function3)
.then(function4)
.then(function5)
.then(function(result) {
//Inside this .then, I'd have the "result" variable as result of the chain
})
.catch(error => { return reject(error); });
如何使用异步等待系统来实现?这是我到目前为止尝试过的:
var commonData = {
data1: ...
data2: ...
data3: ...
data4: ...
data5: ...
data6: ...
};
commonData = await function1(commonData);
commonData = await function2(commonData);
commonData = await function3(commonData);
commonData = await function4(commonData);
commonData = await function5(commonData);
//I was expecting to have inside "commonData" the same situation
//as "result" in the chain above
是否有另一种方法可以将函数与我所缺少的相同的大对象链接在一起?
编辑:
我在这部分使用的 2 个函数...它们是这样设计的,因为它们也在文件的其他部分被调用,我无法在本地使用它们
//function 1
async function function1(commonData) {
try {
var data1 = await models.data1.findAll({where: {Domain_ID: [13,15]}})
data1.forEach(function(dat) {
commonData.data1.push(dat.dataValues);
});
return commonData;
} catch (error) {
throw error;
}
}
//function2
async function function2(commonData) {
try {
var data2 = await models.data2.findAll();
data2.forEach(function(dat) {
commonData.data2.push(dat.dataValues);
});
return commonData;
} catch (error) {
throw error;
}
}
不,没有别的办法。
实施 Async/Await 的原因之一是 Promise 链接看起来非常丑陋和混乱。如果您更喜欢 .then()
,请在本模块中坚持使用它。
进一步阅读:https://blog.logrocket.com/promise-chaining-is-dead-long-live-async-await-445897870abc/
您的方式(commonData = await function1(commonData)
等)很好。但如果你不想这样做,你可以嵌套调用:
const result = await function5(
await function4(
await function3(
await function2(
await function1(commonData)
)
)
)
);
或者使用循环:
let result = commonData;
for (const fn of [function1, function2, function3, function4, function5]) {
result = await fn(result);
}
或者您可以继续使用 then
。虽然通常通过 .then
/.catch
将 async
/await
与显式 promise 处理程序混合在一起会令人困惑,但在某些有限的时间你可以这样做:
const result = await function1(commonData)
.then(function2)
.then(function3)
.then(function4)
.then(function5);
之所以有效,是因为 async
函数只是一种消费和产生承诺的方式。
或者 非常重要的警告 你知道这些函数只修改对象的 状态 而不会 return(用)一个不同的对象(履行他们的承诺),你可以这样做:
await function1(commonData);
await function2(commonData);
await function3(commonData);
await function4(commonData);
const result = await function5(commonData);
但这是一个很大的警告。