javascript - 拒绝 promise 未定义

标签 javascript node.js promise generator co

我尝试使用下面的函数使用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); });

最佳答案

catch error undefined

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

reject(new Error('…'));

另请参阅Should a Promise.reject message be wrapped in Error?

the flow can't continue. why?

好吧,因为你遇到了一个错误,并抛出了 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');
});

关于javascript - 拒绝 promise 未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32215492/

相关文章:

javascript - 消除多次列出 href 的冗余

javascript - 奇怪的行为 angularjs 返回 "TypeError: Cannot assign to read only property"

mysql - 默认情况下,Strongloop 环回应用程序是否使用多个进程?

node.js - Webpack 构建错误

javascript - 将带有resolve和reject的promise转换为异步函数的正确方法(puppeteer)

javascript - Fetch API 总是返回一个 promise

javascript - JS ES6 promise 链接

javascript - 纯 javascript 相当于 jquery $ ("#large_box2_link").click();

javascript - 如何使用事件监听器复制 DOM 节点?

javascript - 一直在onclick中 react 调用函数