首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与superagent的承诺

与superagent的承诺
EN

Stack Overflow用户
提问于 2016-08-14 04:26:57
回答 3查看 1.5K关注 0票数 0

因此,函数getStuff可以工作,但是每当.get方法中出现错误时,我就会遇到问题。参见getStuff2

代码语言:javascript
复制
const request = require('superagent');

function getStuff() {

  return new Promise(function (resolve, reject) {
    request
      .get('http://google.com')
      .end(function (err, res) {
        console.log('getting to end cb');
        if (err) reject(err);
        resolve(res.body);
      })
  });

}

function getStuff2() {

  return new Promise(function (resolve, reject) {
    request
      .get('abc')
      .end(function (err, res) {
        console.log('getting to end cb');
        if (err) reject(err);
        resolve(res.body);
      })
  });

}

//works
getStuff().then(function (htmlBody) {
  console.log(htmlBody);
}).catch(function(err) {
  console.log('err');
});

//doesn't work
getStuff2().then(function (htmlBody) {
  console.log(htmlBody);
}).catch(function(err) {
  console.log('err');
});

getStuff2中似乎没有正确处理来自superagent的错误,因为我在捕获中看不到控制台日志消息。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-16 01:50:58

正如@robertklep指出的那样,存在DNS解析问题。下面是本地路由的DNS通配符stats.research.icann.org/dns/wildcard。如果您将代码更改为不同的虚拟url,则会捕获错误。即

代码语言:javascript
复制
const request = require('superagent');

function getStuff2() {

  return new Promise(function (resolve, reject) {
    request
      .get('bing-bong-bang')
      .end(function (err, res) {
        console.log('getting to end cb');
        if (err) return reject(err);
        resolve(res.body);
      })
  });

}

getStuff2().then(function (htmlBody) {
  console.log(htmlBody);
}).catch(function(err) {
  console.log('err');
}

在本例中,错误被正确捕获。DNS错误最终会超时,但需要一分钟时间。

票数 1
EN

Stack Overflow用户

发布于 2016-08-14 04:42:58

您对您遇到的确切问题很含糊,但我在下面的代码中失败了:

代码语言:javascript
复制
if (err) reject(err);
resolve(res.body);

调用reject不会导致其余代码停止运行,因此它会导致后续的异常,因为res是未定义的(因此访问res.body将抛出TypeError)。

这是一个很好的实践,在你拒绝一个承诺后结束当前的函数:

代码语言:javascript
复制
if (err) return reject(err);

或者将其设为if-else:

代码语言:javascript
复制
if (err) {
  reject(err);
} else {
  resolve(res.body);
}
票数 1
EN

Stack Overflow用户

发布于 2016-08-14 04:34:46

试着这样做:

代码语言:javascript
复制
getStuff2().then(function (htmlBody) {
  console.log(htmlBody);
}, function(err) {
  throw err;
}).catch(function(err) {
  console.log(err.message);
});

Reject不会抛出错误,你自己要对此负责。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38936699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档