【发布时间】:2021-05-14 09:23:06
【问题描述】:
我有一个代码可以在我的系统中更新或创建新用户。它与 forEach 函数一起使用,效果很好。 但是,我想利用 Node.js 并同时执行多个更新/创建。 我试图创建一系列承诺,但我认为我构建的承诺是错误的。 这是可以正常工作的代码:
import usersjson from './jsons/users.json';
if (usersjson.users.length) {
for (const user of usersjson.users) {
let getuser = getUser(url, user.Id, 'Id');
getuser.then((data) => {//Make a call to get user by id
if (data.users.length != 0) { //If user exists
let update = updateUser(url, user, data.users[0].id);//update user function
update.then((updateresponse) => {
console.log(updateresponse);
}).catch((err) => {
console.log(err);
})
} else { //if user doesn't exist
let update = newUser(url, user);//createUser(settings.fieldMap, user)
update.then((response) => {
console.log(response);
}).catch((err) => {
console.log(err);
});
}
})
};
};
现在,我想将“更新”变成 Promise,这样我就可以使用 Promise.all() 同时发送多个。这是我尝试过的:
import usersjson from './jsons/users.json';
let promises = [];
if (usersjson.users.length) {
for (const user of usersjson.users) {
if (promises.length <= 20) {
let getuser = getUser(url, user.Id, 'Id');
getuser.then((data) => {//Make a call to get user by id
if (data.users.length != 0) { //If user exists
let update = new promise ((resolve, reject) => {
updateUser(url, user, data.users[0].id).then((response) => {
resolve(response);
}).catch((err) => {
console.log(err)
});
});
promises.push(update);
} else { //if user doesn't exist
let update = new promise ((resolve, reject) => {
newUser(url, user).then((response) => {
resolve(response);
}).catch((err) => {
console.log(err);
})
});
psomises.push(update);
}
});
} else {
await promises.all(update)
.then ((result) => {
console.log(result);
promises = [];
}).catch(err){
console.log(err);
}
};
};
};
但我收到一条错误消息:
(node:22016) UnhandledPromiseRejectionWarning: ReferenceError: promise 没有定义 在文件:///C:/xampp/htdocs/NodeAPI/server.js:70:21 在 processTicksAndRejections (internal/process/task_queues.js:97:5) (node:22016) UnhandledPromiseRejectionWarning:未处理的承诺拒绝。这 错误源于在异步函数内部抛出 没有 catch 块,或拒绝未处理的承诺 使用 .catch()。在未处理的承诺上终止节点进程 拒绝,请使用 CLI 标志
--unhandled-rejections=strict(请参阅 https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode)。 (拒绝 ID:1)(节点:22016)[DEP0018] 弃用警告:未处理 不推荐使用承诺拒绝。在未来,承诺拒绝 未处理的将终止 Node.js 进程 非零退出代码。
我的问题是,如何让数组中的 20 个用户同时运行 forEach,而不是一个一个地运行?
【问题讨论】:
-
你为什么要把
await和then混在一起? -
另外,您不再需要使用
.forEach。for( of )是很久以前添加到 JavaScript 中的,它适用于任何可迭代对象,包括所有具有.forEach函数属性的类型。 -
因为我显然不知道自己在做什么? :) 我什至不知道为什么我的原始代码需要使用 Promise。我只是被要求这样做。
-
这段代码比它需要的要复杂得多。我会先以更简单的方式重写它。我不太了解您试图用这段代码完成什么,以及您调用的某些函数做了什么才能建议进行更简单的重写。
-
另外,你不会“执行承诺”。您执行函数,某些函数可能会返回一个 Promise,它只是一个帮助您监视异步操作的对象。承诺不会“执行”。区别不仅仅是语义,因为它对于理解异步操作和承诺实际发生的事情很重要。
标签: node.js arrays foreach promise