我有这个嵌套函数,但它只调用前两个函数,然后跳过其他的。添加它的速度太快,无法重定向到另一个页面。我想要实现的是确保每个实例在继续到另一个实例之前完成它的工作:
场景:
第一个实例//第一个调用
第二个实例//下一个调用然后
第三个实例//下一个调用然后
第四个实例//最后一个调用
我可以知道我做错了什么吗?
我是这样做的:
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")
});
});
});
})
}
如果你写的基于承诺的代码嵌套得越来越深,那你就做错了。承诺的存在正是为了避免这种圣诞树类型的代码。
不是嵌套得越来越深,而是返回每个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 + ")");
});