打破Promise链

时间:2017-09-21 22:05:24

标签: javascript promise

我正在创建一个函数,该函数返回一个Promise,以便在Promise.all(myArray.map(saidFunction))中使用Bluebird。在这个函数中,我将检查数据库中是否存在记录,如果存在则返回,否则继续执行其他操作。

function saidFunction((objectInfo)) {
  return new Promise((resolve, reject) => {
    app.models.MyObjectType.exists(objectInfo['id'])
    .then((exists) => {
      if (exists) return resolve('Object already exists');
    })
    .then(() => {
      console.log('If object does not exist, print this and do some other stuff');
    })
    .then(() => {
      return resolve('Successfully completed');
    })
    .catch((error) => return reject(error));
  });
}

我的问题是,即使对象存在,也会打印If object does not exist, print this。因此,我正在寻找一种解决方案来返回Promise,而不会继续使用下一个函数。

2 个答案:

答案 0 :(得分:2)

在您的情况下,一些then回调仅包含同步代码,您应该加入它们并在一次回调中验证exists

另外,避免promise构造函数反模式,app.models.MyObjectType.exists已经返回一个promise,所以你不应该创建一个新的。

function saidFunction((objectInfo)) {
  return app.models.MyObjectType
    .exists(objectInfo['id'])
    .then(exists => {
      if (exists) {
        console.log('Object already exists');
        return true;
      }
      console.log('If object does not exist, print this and do some other stuff');
      return false;
    })
    .catch(err => console.log(err));
  });
}

<强>更新

如果您需要执行异步任务,使用先前异步调用的结果,您可以使用Promise.all

function saidFunction((objectInfo)) {
  return app.models.MyObjectType
    .exists(objectInfo['id'])
    .then(objExists => {
      if (objExists) {
        return [true, true];
      }
      return Promise.all([false, ensureFolderExistsAsync()]);
    })
    .then(([objExists, folderExists]) => {
      if (!objExists && folderExists) {
        return saveIconAsync();
      }
      return null;
    })
    .catch(err => console.log(err));
  });
}

在上面的例子中,当对象存在时,我返回一个数组[true, true](并且文件夹也存在)。如果该对象不存在,我检查该文件夹是否存在,调用ensureFolderExistsAsync并使用Promise.all传递objectExists值和异步调用的结果。

答案 1 :(得分:0)

这是一种在throw运营商的帮助下中断并立即解决承诺链的方法。

function saidFunction((objectInfo)) {
  return new Promise((resolve, reject) => {
    app.models.MyObjectType.exists(objectInfo['id'])
    .then(exists => {
      if (exists) {
        throw ALREADY_EXISTS; // some constant
      }
    })
    .then(() => 
      console.log('If object does not exist, print this and do some other stuff')
    )
    .then(() => 
      resolve('Successfully completed')
    )
    .catch(error => {
      if(error === ALREADY_EXISTS) {
        resolve('Object already exists');
      } else {
        reject(error);
      }
    });
  });
}