完成Java的递归承诺函数执行

时间:2018-12-04 21:27:37

标签: javascript node.js promise es6-promise

我有3个函数,func1()返回一些api数据到func2(),func2()从func3()调用。Func2()有一个Promise返回类型,在Func2()中,我只解决某些条件是遇到其他情况,我想调用相同的Func2()直到条件满足,但是当我执行func3()时。我看不到func2()的响应。我收到错误消息“回调”参数必须为 函数:TypeError:“回调”参数必须是一个函数。

//func1()
const apiRequest = (options, func_callback) => {
  request(options, (err, res, body) => {
    let result = {
      body: body,
      error: err,
      res: res
    }
    func_callback(result);
  });
};
//func2
const getPromise = (options) => {
  return new Promise((resolve, reject) => {
    apiRequest(options, (response) => {
      if (response.error) {
        reject(response.error);
      }
      if (response.body.hasOwnProperty('message')) {
        console.error(`Error: Invalid token`);
        new Promise((resolve, reject) => {
          const payload = {
            url: 'https://abc',
            form:{},
            method: 'post'
          };
          request(payload, (err, res, body) => {
            if (err) {
              reject(err);
            }
            else {
              resolve(body);
            }
          });
        }).then((result) => {

          options.headers.Authorization = 'Bearer '+result;
          getPromise(options); // seems Issue having this line to call again
        });
      }
      else {
        resolve(response.body);
      }
    });
  });
};

// func3()
function getSession() {
  const options={url:''someurl',     
  getPromise.then(result => {
    console.log('all ID'+result); // I can not see result here
  .catch(error => {
    console.log('Error ', error);
  });
}

3 个答案:

答案 0 :(得分:2)

应该创建承诺的唯一地方是在包装apiRequest的函数中。那个(“ promisify-ing”)包装器除了建立在回调内部解析的promise外,什么都不做。

//func1()
const apiRequest = (options, func_callback) => {
    request(options, (err, res, body) => {
        let result = {
            body: body,
            error: err,
            res: res
        }
        func_callback(result);
    });
};

// wrap the apiReqeust function in a promise.  place no other logic in here...
const apiRequestP = (options) => {
    return new Promise((resolve, reject) => {
        apiRequest = (options, response => {
            (response.error)? reject(response.error) : resolve(response);
        })
    });
};

现在有一个返回承诺的包装器没有其他函数可以调用回调样式函数

看来func2的意图是返回一个发出请求的诺言,并添加逻辑来检查和解决auth挑战。为此,请先创建一个承诺返回函数来修复已知需要的请求的auth:

// return a promise to make a token request followed by an auth'd version
// of the request described in the options param
const remediateAuth = (options) => {
    console.error(`Error: Invalid token`);
    const authOptions = { url: 'https://abc', form:{}, method: 'post' };
    return apiRequestP(authOptions).then(response => {
        options.headers.Authorization = 'Bearer '+response;
        return apiRequestP(options);
    }).then(response => response.body);
}

这样,func2变得非常简单。请注意,没有其他明确创建的承诺。还要注意,此功能是确保经过身份验证的请求的层,因此应用程序的其余大部分都可以调用它,而不能使用上述较低级别的功能:

// was called func2
const authedRequest = (options) => {
    return apiRequestP(options).then(response => {
        return (response.body.hasOwnProperty('message'))? remediateAuth(options) : response.body;
    });
}

答案 1 :(得分:1)

在创建if的{​​{1}}条件下,您永远不会解决外部承诺。

您可以通过在正确的位置添加new Promise(…).then(…)来解决此问题,但是无论如何您都不应该在promise中创建promise。您应该在最低级别上承诺。让resolve返回一个Promise,而不是让它回调。

api_request

您甚至可以重用它,并使用适当的Promise链:

// func1()
function apiRequest(options, func_callback) {
  return new Promise((resolve, reject) => {
    request(options, (err, res, body) => {
      if (err) reject(err);
      else resolve({ body, res });
    });
  });
}

答案 2 :(得分:0)

似乎在函数“ getPromise”中得到了(解析,拒绝),但是在函数内部创建了另一个Promise,然后又创建了另外2个变量(“解析,拒绝”),它们覆盖了原始解析,然后您真的没有getPromise的任何返回值

第一次分配:

const getPromise = (options) => {
      return new Promise((resolve, reject) => {

和第二项作业:

console.error(`Error: Invalid token`);
            new Promise((resolve, reject) => {