javascript - 使用 promise

标签 javascript node.js error-handling promise throw

我想创建一个返回 promise 的函数,如果其中出现错误,它会返回 promise reject。

function promiseFunc(options) {
  return new Promise(() => {
    return options;
  });
}

function myfunc(options) {
  return new Promise(() => {
    if (!options) throw new Error("missing options");

    return promiseFunc(options).then((result) => {
      if (result.throwerr) throw new Error("thrown on purpose");

      return result.value;
    });
  });
};

我的测试如下:

const myfunc = require("./myfunc");

describe('myfunc', () => {
  it('should fail without options', () => {
    return myfunc()
      .then((result) => { throw new Error(result) }, (err) => {
        console.log("test #1 result:", err.message === "missing options");
      });
  });

  it('should fail on options.throwerr', () => {
    return myfunc({throwerr: true})
      .then((result) => {}, (err) => {
        console.log("test #2 result:", err.message === "thrown on purpose");
      });
  });

  it('should return options.value', () => {
    return myfunc({value: "some result", throwerr: false})
      .then((result) => {
        console.log("test #3 result:", result === "some result");
      }, (err) => {});
  });
});

第一次测试通过,但第二次和第三次失败。

Log #2 甚至没有运行,所以我假设“故意抛出”搞砸了一些东西,因此我创建了测试 #3,我没有抛出任何东西,但它仍然失败。 我错过了什么?

解决方法:

function promiseFunc(options) {
  return new Promise(resolve => {
    return resolve(options);
  });
}

function myfunc(options) {
  return new Promise((resolve, reject) => {
    if (!options) throw new Error("missing options");

    return promiseFunc(options).then(result => {
      if (result.throwerr) throw new Error("thrown on purpose");

      return resolve(result.value);
    }).catch(err => {
      return reject(err);
    });
  });
};

最佳答案

您忘记传递一个带有 resolve 和 reject 参数的函数,所以您的 promise 不起作用。

function promiseFunc(options) {
  return new Promise(resolve => { // resolve function
    resolve(options)
  })
}

module.exports = function myfunc(options) {
  return new Promise((resolve, reject) => { // since you may either resolve your promise or reject it, you need two params
    if (!options) {
      return reject(new Error("missing options"))
    }

    return promiseFunc(options).then(result => {
      if (result.throwerr) {
        return reject(new Error("thrown on purpose"))
      }
      resolve(result.value)
    })
  })
}

...和测试(mocha)

const assert = require('assert'),
      myfunc = require("./myfunc")

describe('myfunc', () => {
  it('should fail without options', done => { // mind the callback, promises are always async
    myfunc()
      .catch(err => {
        assert(err.message === "missing options")
        done() // <- called here
      })
  })

   it('should fail on options.throwerr', done => {
      myfunc({throwerr: true})
         .catch(err => {
            assert(err.message === "thrown on purpose")
            done()
      })
   })

  it('should return options.value', done => {
    return myfunc({value: "some result", throwerr: false})
      .then(result => {
          assert(result === "some result")
          done()
       })
    })
 })

关于javascript - 使用 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36652195/

相关文章:

javascript - 单击 anchor 标记时获取父级 <th> 的属性值

node.js - 使用 Nodejs 的 Xmpp ejabberd 自定义身份验证

javascript - 将 PHP 与 node.js/javascript 连接

angular - 使用异步/等待时,错误处理程序返回默认值

javascript - QT 和 QwebKit 我可以加载 javascript 文件作为资源文件并使用它吗?

javascript - 函数和对象之间的差异及其如何影响性能

javascript - 获取插入符相对于 contenteditable div 中窗口的视觉位置

javascript - 错误 : spawn EACCES in ubuntu for node. js/express 应用程序尝试运行 python

javascript - 如何从不同域的脚本报告 JS 错误?

python - 如何在PyQt5中捕获libpng错误错误的自适应滤波器