Единственное место, где должно быть создано обещание, - это функция, заключающая в себе apiRequest
.Эта оболочка («обещание») не должна делать ничего, кроме создания обещания, которое разрешается внутри обратного вызова.
//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 для запроса, который, как известно, нуждается в этом:
// 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;
});
}