如何解决jquery中如何获取正确的嵌套函数
我有这个嵌套函数,但它只调用了前 2 个函数,然后跳过了其他函数。添加重定向到另一个页面太快了。我想要实现的是这一点,并确保每个实例在继续另一个实例之前完成其工作:
场景:
第一个实例 // 第一次调用
秒实例 // 下一个调用然后
第三个实例 // 下一个调用然后
第四个实例 // 最后一次调用
我可以知道我做错了什么吗?
这就是我所做的:
if (db_name != "" && contact != "" && email !="")
{
// createdb
session.rpc('/custom/createdb',{
db_name: db_name,}).then(function()
{
console.log("Database created successfully")
//initdb
session.rpc('/custom/initdb',{
db_name: db_name,}).then(function()
{
console.log("Database initialized successfully")
// IT SKIPS HERE
//installapps
session.rpc('/custom/installapps',{
db_name: db_name,}).then(function()
{
console.log("Apps installed successfully")
// AND HERE TOO
//createaccount
session.rpc('/custom/createaccount',{
db_name : db_name,contact_name: contact,email_from: email,}).then(function ()
{
console.log("User account created successfully")
});
});
});
})
}
解决方法
如果您编写的基于 Promise 的代码嵌套越来越深,那么您就做错了。 Promise 的存在正是为了避免这种圣诞树类型的代码。
与其嵌套越来越深,不如返回每个 RPC 调用给您的承诺。您还需要从您的工作函数返回顶级承诺,以便调用代码可以等到一切都完成:
function creacteAccount(db_name,contact,email) {
if (!(db_name > "" && contact > "" && email > "")) {
return Promise.reject("One of the parameters is empty");
}
return session.rpc('/custom/createdb',{db_name: db_name}) // return here
.then(function () {
console.log("Database created successfully");
return session.rpc('/custom/initdb',{db_name: db_name}); // and here
}).then(function () {
console.log("Database initialized successfully");
return session.rpc('/custom/installapps',{db_name: db_name}); // and here
}).then(function () {
console.log("Apps installed successfully");
return session.rpc('/custom/createaccount',{ // and here
db_name : db_name,contact_name: contact,email_from: email
});
}).then(function () {
console.log("User account created successfully");
});
}
在调用代码的 .then()
中进行重定向,在 .catch()
中进行错误处理:
creacteAccount("myDB","contact","email").then(function () {
// redirect...
}).catch(function (err) {
alert("Could not create account! (" + err + ")");
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。