在这里,我有一系列的承诺,它们工作得很好。所有的*.销毁都是返回承诺的承诺:
function callDBDestroy() {
var db;
DB_Categories.destroy().then(function () {
return DB_Equipment.destroy();
}).catch(function (err) {
showMsg("Error in callDBDestroy: " + err);
}).then(function () {
return DB_Certificates.destroy();
}).catch(function (err) {
showMsg("Error in callDBDestroy: " + err);
}).then(function () {
return DB_Locations.destroy();
}).catch(function (err) {
showMsg("Error in callDBDestroy: " + err);
});
}但我想在每个数据库中添加一条if语句,以检查PouchDB数据库是否存在(如果DB_*为空,则不存在)。
如果它存在,我想销毁它,然后返回(这些都是返回承诺)。
如果它不存在,我想返回一个匿名promise,它不返回任何内容,因为这些promise中没有任何我关心的数据。
在本例中,我添加了一些示例代码来执行if语句,我想知道将在传递promise (resolve)值的空实例中放入什么内容。
function callDBDestroy() {
var db;
DB_Categories.destroy().then(function () {
if( DB_Equipment != null) {
return DB_Equipment.destroy();
}
else {
Anonymous empty promise - something like:
new Promise().resolve();
}
}).then(function () {
return DB_Certificates.destroy();
}).then(function () {
return DB_Locations.destroy();
}).catch(function (err) {
showMsg("Error in callDBDestroy: " + err);
});
}谢谢,
汤姆
发布于 2017-03-21 06:53:20
看起来你只是想知道如何手动解决/拒绝一个承诺。如果是这样的话,如果您想转到catch处理程序,您可以只调用Promise.resolve(optionalValue)或Promise.reject(optionalValue):
function callDBDestroy() {
var db;
DB_Categories.destroy()
.then(function () {
if( DB_Equipment != null) {
return DB_Equipment.destroy();
} else {
return Promise.resolve();
}
}).then(function () {
return DB_Certificates.destroy();
}).then(function () {
return DB_Locations.destroy();
}).catch(function (err) {
showMsg("Error in callDBDestroy: " + err);
});
}发布于 2017-03-21 06:54:10
你可以包装它:
function withDb(db, handler) {
return function onFulfilled(value) {
if(db === null) throw new Error("DB Null");
return handler(value);
});
}这样你就可以做到:
function callDBDestroy() {
var db;
var w = withDb(db); // or whatever instance
DB_Categories.destroy().then(w(function () {
// do stuff
}))); // .then(w( to chain calls here.
...
}发布于 2017-03-21 07:00:24
我想返回一个匿名的promise,它不返回任何内容,因为promise中没有任何我关心的数据。类似于:
new Promise().resolve();
您正在寻找Promise.resolve(undefined)。虽然您可以省略undefined,但这是隐式的。
….then(function () {
if (DB_Equipment != null) {
return DB_Equipment.destroy();
} else {
return Promise.resolve(undefined);
}
}).…您甚至不需要从then回调中返回promise,只需返回undefined (或不返回returning)就可以达到同样的效果。
….then(function () {
if (DB_Equipment != null) {
return DB_Equipment.destroy();
}
}).…在您的例子中,我建议使用包装器函数:
function destroyDatabase(db, name = "db") {
if (db != null)
return db.destroy().catch(err => {
showMsg(`Error in destroying ${name}: ${err}`);
});
else
return Promise.resolve();
}
function callDBDestroy() {
return destroyDatabase(DB_Categories, "categories")
.then(() => destroyDatabase(DB_Certificates, "certificates"))
.then(() => destroyDatabase(DB_Locations, "locations"))
}
// or even in parallel:
function callDBDestroy() {
return Promise.all([
destroyDatabase(DB_Categories, "categories"),
destroyDatabase(DB_Certificates, "certificates"),
destroyDatabase(DB_Locations, "locations")
]);
}https://stackoverflow.com/questions/42915331
复制相似问题