我有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);
});
}
答案 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) => {