我试图从异步承诺中获取响应。然后在解析后运行一个函数来清理json响应。
然后将该值返回到promise ..然后将promise返回给在前端调用它的函数
(或者可能是一个接一个,只是一种良好的清洁模式)
vimeo = function(album_id) {
var url = '';
url += 'https://api.vimeo.com/users/vimeouser123/albums/';
url += album_id;
url += '/videos?direction=asc&sort=date';
url += '&fields=uri,name,description,pictures';
var options = {
url: url,
method: 'GET',
headers: {
'Authorization': 'Bearer abc123',
'Content-Type': 'application/json',
}
};
var vimeocall = new Promise(function(resolve, reject) {
request(options, function(err, response, body){
if(true){resolve(body)};
});
});
vimeocall.then(function(result) {
return vimeo_clean_data(result);
});
return vimeocall;
}
因此,在api调用后,promise会返回ok,即vimeo_clean_data(result);函数运行正常,console.log是已清理的代码
我可以让它回到客户端的主要承诺,但它是原始的json响应
我如何让它将干净的json返回到承诺,而承诺又返回或只是将数据返回到调用它的前端函数
(作为参考,它是一个调用它的meteor js方法,它返回了promise和数据,而不是promise.then部分)
答案 0 :(得分:1)
您不想返回vimeocall
,而是希望返回之前通话的回复vimeocall.then
。
return vimeocall.then(function(result) {
return vimeo_clean_data(result);
});
当您在承诺上调用.then
时,它将始终返回另一个承诺,该承诺通过返回传入的回调得到解决(或被捕获的任何错误拒绝)。
https://promisesaplus.com/#point-40
然后必须返回一个承诺[3.3]。
promise2 = promise1.then(onFulfilled, onRejected);
- 如果
onFulfilled
或onRejected
返回值x
,请运行承诺解决程序[[Resolve]](promise2, x)
。- 如果
onFulfille
d或onRejected
引发异常e
,则必须拒绝promise2
e
作为原因。- 如果
onFulfilled
不是功能且promise1
已履行,则必须使用与promise2
相同的值来履行promise1
。- 如果
onRejected
不是功能且promise1
被拒绝,则必须拒绝promise2
,理由与promise1
相同。
您可以在原始承诺回调中调用vimeo_clean_data()
:
return new Promise(function(resolve, reject) {
request(options, function(err, response, body){
if(err){
//either handle the error here or:
reject(err);
else {
resolve(vimeo_clean_data(body))
};
});
});
当您需要进行多次异步调用时,将代码拆分为多个then()
调用非常有用。您可以从一个then()
调用返回一个promise,并且将使用返回的promise的结果调用链中的下一个then()
。 (并且不要忘记处理/传播可能的错误!)