gpt4 book ai didi

JavaScript promise 不会按顺序触发

转载 作者:行者123 更新时间:2023-11-30 08:22:21 26 4
gpt4 key购买 nike

我一直在努力有效地管理如何在我的 Express.js 应用程序中构建我的 promise 。

现在我有以下场景:在注册过程中,用户有一个可选的 Organization Name field 。如果填写,我需要创建 Organization对象,然后添加 _id它与我申请的其他信息 user .如果没有Organization name , 继续并更新基本 user信息。

<-- 现在 user正在 organization 之前更新正在创建。 -->

//basic info passed from the signup form
info['first_name'] = req.body.first_name;
info['last_name'] = req.body.last_name;
info['flags.new_user'] = false;

//if organization name is passed, create object and store _id in user object.
let create_organization = new Promise(function(resolve, reject) {
if (req.body.organization_name !== "") { //check if name is sent from form
Organization.create({
name: req.body.organization_name
}, function(err, result) {
console.log(result);
if (!err) {
info['local.organization'] = result._id;
resolve()
} else {
reject()
}
})
} else {
resolve()
}
});

let update_user = new Promise(function(resolve, reject) {
User.update({
_id: req.user._id
}, info, function(err, result) {
if (!err) {
console.log("Updated User!"); < --prints before Organization is created
resolve();
} else {
reject();
}
})
});

create_organization
.then(function() {
return update_user;
})
.then(function() {
res.redirect('/dash');
})

最佳答案

在开始后续工作之前,您的代码中没有任何内容会等待第一个 promise 完成。一旦您调用 User.update,工作就会开始,当您使用 promise 执行器中的代码调用 new Promise 时,它会同步完成。

相反,请等到之前的 promise 解决后再执行此操作。我会通过将这些函数包装在可重用的启用 promise 的包装器(createOrganizationupdateUser)中来实现:

// Reusable promise-enabled wrappers
function createOrganization(name) {
return new Promise(function(resolve, reject) {
Organization.create({name: name}, function(err, result) {
console.log(result);
if (err) {
reject(err);
} else {
resolve(result);
}
});
});
}

function updateUser(id, info) {
return new Promise(function(resolve, reject) {
User.update({_id: id}, info, function(err, result) {
if (err) {
reject(err);
} else {
resolve();
}
})
});
}

(您可以使用 util.promisifypromisify npm 模块来避免手动执行此操作。)

然后:

//basic info passed from the signup form
info['first_name'] = req.body.first_name;
info['last_name'] = req.body.last_name;
info['flags.new_user'] = false;

//if organization name is passed, create object and store _id in user object.
(req.body.organization_name === "" ? Promise.resolve() : createOrganization(req.body.organization_name))
.then(function() {
return updateUser(req.user._id, info);
})
.catch(function(error) {
// handle/report error
});

(我坚持使用 ES5 级别的语法,因为您的代码似乎正在这样做...)

关于JavaScript promise 不会按顺序触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51400245/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com