【问题标题】:reject in promise undefined拒绝承诺未定义
【发布时间】:2015-11-19 20:03:37
【问题描述】:

我尝试了下面的函数使用co 和javascript promise 测试,fulfill 将成功返回但reject 不会,并捕获未定义的错误。并且流程无法继续。为什么?

错误:

> at GeneratorFunctionPrototype.next (native)
    at onFulfilled (/Users/../project/app/node_modules/co/index.js:65:19)
    at runMicrotasksCallback (node.js:337:7)
    at process._tickDomainCallback (node.js:381:11)

代码:

domain.run(function() {

  var testPromise = function() {
    return new Promise(function (fulfill, reject){
      //reject('error');
      reject(new Error('message'));
    });
  };


co(function *() {
  var d = yield testPromise();
  console.log(d);
  res.send('fin');
}).catch(onerror);
function onerror(error) { console.error(error.stack); }

});
domain.on('error', function(error) { console.error(error); });

【问题讨论】:

  • reject 参数本身是否未定义?或者可能是因为您将一个字符串传递给了reject(),而该字符串没有.stack 属性(稍后在您的代码中引用)?
  • 您应该始终将错误对象传递给拒绝处理程序。现有的错误对象或new Error('blah blah')
  • 如果我删除 catch 功能承诺仍然相同,无法移动到下一个功能
  • 不要移除卡扣。相反,请在上面的代码中执行reject(new Error('error'))。明白我的意思了吗?
  • 我编辑了,但我的问题是函数没有继续移动到下一个只是停止

标签: javascript node.js promise generator co


【解决方案1】:

捕获未定义的错误

没有。它捕获错误'error',即您拒绝的值。当然,它并不是真正的Error,而是一个字符串,因此它没有.stack 属性——这就是它记录undefined 的原因。修复你的代码

reject(new Error('…'));

另见Should a Promise.reject message be wrapped in Error?

流程无法继续。为什么?

好吧,因为你有一个错误,并抛出exceptions 确实有这种行为。您还需要在错误处理程序中发送响应!

co(function *() {
  …
}).catch(function onerror(error) {
  console.error(error.stack);
  res.send('err');
});

或者,如果您打算在通话中继续流程,请将.catch 处理程序放在那里:

co(function *() {
  yield testPromise().then(function(d) {
    console.log(d);
  }).catch(function(error) {
    console.error(error.stack);
  });
  res.send('fin');
});

或者,将您的 Promise 调用包装在 try-catch 中:

co(function *() {
  try {
    var d = yield testPromise();
    console.log(d);
  } catch(error) {
    console.error(error.stack);
  }
  res.send('fin');
});

【讨论】:

  • 我正在编辑,但我的问题是该功能没有继续移动到下一个只是停止
  • 所以?域也不会继续流动。我不确定你的误解在哪里。
  • @user1775888:预期的结果是什么?您认为您的代码将如何工作?
  • 我更新了问题,所以域不能代替try catch?
  • 好吧,如果您不打算创建错误,那么您当然不应该首先拒绝承诺。完全不知道你为什么这样做?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
  • 2018-01-18
相关资源
最近更新 更多