首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Promise链和匿名promise returns

Promise链和匿名promise returns
EN

Stack Overflow用户
提问于 2017-03-21 06:44:59
回答 5查看 997关注 0票数 0

在这里,我有一系列的承诺,它们工作得很好。所有的*.销毁都是返回承诺的承诺:

代码语言:javascript
复制
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)值的空实例中放入什么内容。

代码语言:javascript
复制
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);
   });
}

谢谢,

汤姆

EN

回答 5

Stack Overflow用户

发布于 2017-03-21 06:53:20

看起来你只是想知道如何手动解决/拒绝一个承诺。如果是这样的话,如果您想转到catch处理程序,您可以只调用Promise.resolve(optionalValue)Promise.reject(optionalValue)

代码语言:javascript
复制
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);
   });
}
票数 1
EN

Stack Overflow用户

发布于 2017-03-21 06:54:10

你可以包装它:

代码语言:javascript
复制
function withDb(db, handler) {
    return function onFulfilled(value) {
       if(db === null) throw new Error("DB Null");
       return handler(value);
    });
}

这样你就可以做到:

代码语言:javascript
复制
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.
    ...
}
票数 0
EN

Stack Overflow用户

发布于 2017-03-21 07:00:24

我想返回一个匿名的promise,它不返回任何内容,因为promise中没有任何我关心的数据。类似于:

new Promise().resolve();

您正在寻找Promise.resolve(undefined)。虽然您可以省略undefined,但这是隐式的。

代码语言:javascript
复制
….then(function () {
    if (DB_Equipment != null) {
        return DB_Equipment.destroy();
    } else {
        return Promise.resolve(undefined);
    }
}).…

您甚至不需要从then回调中返回promise,只需返回undefined (或不返回returning)就可以达到同样的效果。

代码语言:javascript
复制
….then(function () {
    if (DB_Equipment != null) {
        return DB_Equipment.destroy();
    }
}).…

在您的例子中,我建议使用包装器函数:

代码语言:javascript
复制
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")
    ]);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42915331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档