拒绝承诺未定义

时间:2015-08-25 23:02:35

标签: javascript node.js promise generator co

我尝试了下面的函数使用co和javascript promise test,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); });

1 个答案:

答案 0 :(得分:5)

  

捕获错误未定义

没有。它会捕获错误'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');
});