未定义解析,使用非内联函数作为回调node.js承诺

时间:2018-09-20 08:53:33

标签: javascript node.js callback promise

我想创建一个通用的回调函数,我所有的REST函数都可以使用,在这种情况下,它称为defaultCallback,定义如下。问题是,当我点击它时,出现“未定义解析”错误。使用非内联定义的函数作为回调的这种范例是否可能?如果是这样,我在做什么错?这是我的代码

function getUsingRest() {
    return new Promise(function (resolve, reject) { 
      request({
      url: url,
      headers: headers
    }, function(error, response) {
          defaultCallback(error, response);
      });
    });
  }

  function defaultCallback(error, response) {
    if(error) {
        reject(error);
      } else {
        resolve(JSON.parse(response.body));
      }
  }

2 个答案:

答案 0 :(得分:0)

是的,您需要在defaultCallback构造函数中声明new Promise,以使resolvereject变量在范围内。只需删除该“默认回调”并编写

function getUsingRest() {
  return new Promise(function (resolve, reject) { 
    request({
    url: url,
    headers: headers
  }, function(error, response) {
    if (error) {
      reject(error);
    } else {
      resolve(JSON.parse(response.body));
    }
  });
}

或更佳

function getUsingRest() {
  return new Promise(function(resolve, reject) { 
    request({
    url: url,
    headers: headers
  }, function(error, response) {
    if (error) {
      reject(error);
    } else {
      resolve(response);
    }
  }).then(response => JSON.parse(response.body));
}

以便捕获JSON.parse中的异常并导致承诺被拒绝。

如果您坚持要使“默认” promise回调具有通用性,以便可以在多个函数之间共享它,请查看util.promisify(及其相关实现,以备您感兴趣)。

答案 1 :(得分:-1)

不需要用匿名函数包装defaultCallback
尝试改变

 request(json, function(error, response) {
      defaultCallback(error, response);
  });

request(json, defaultCallback);