Javascript - 处理不存在的函数的Promise错误

时间:2018-02-12 17:20:42

标签: javascript promise

我有一个奇怪的情况,我需要检查用户插入的函数的值,理想情况下,如果用户插入不存在的函数,则返回错误的promise。我正在思考这些问题:

var p = new Promise(function(resolve, reject) {

  var customVar = customClass.userSelected(1, 2);

  if (customVar) {
    console.log("Success!");
    resolve(data);
  } else {
    console.log("Failure!");
    reject(err);
  }

});

其中userSelected是用户插入的内容。但是当然这个赠品可以给我一个" userSelected不是一个功能"如果他们插入的东西不是customClass的方法。有没有正确的方法来检查这个承诺,或者我只需要用switch语句或类似的东西进行检查?

1 个答案:

答案 0 :(得分:2)

我认为这里不需要任何承诺,但要明白你的问题:

假设你有input,一个包含你从用户那里得到的函数名的变量(可能是"foo")。您可以通过检查customClass确保它存在于其中:

if (typeof customClass[input] === "function") {
    // Yes, it's a function
}

如果input"foo",您知道customClass有一个名为foo的属性,其值为函数。

因此,如果我们将其插入您的示例中(但同样,我不明白为什么我们需要这样做的承诺):

var input = /*...the function name from the user...*/
var p = new Promise(function(resolve, reject) {

  if (typeof customClass[input] !== "function") {
    reject(new Error(input + " is not a valid method"));
  } else try {
    resolve(customClass[input](1, 2));
  } catch (e) {
    reject(new Error(input + " failed with an error: " + e.message));
  }
});

请注意,如果我们不想为它提供自定义错误,我们不必捕获调用该方法的异常; promise执行函数中的错误抛出拒绝承诺。因此,如果您只想让原始错误成为拒绝:

var input = /*...the function name from the user...*/
var p = new Promise(function(resolve, reject) {

  if (typeof customClass[input] !== "function") {
    reject(new Error(input + " is not a valid method"));
  } else {
    resolve(customClass[input](1, 2));
  }
});