programacion - promesas javascript
Eliminando promesas anidadas (1)
Soy nuevo en las promesas y escribo código de red usando solicitudes y promesas en NodeJS.
Me gustaría eliminar estas promesas anidadas y encadenarlas en su lugar, pero no estoy seguro de cómo voy a hacerlo / si es la manera correcta de hacerlo.
exports.viewFile = function(req, res) {
var fileId = req.params.id;
boxContentRequest(''files/'' + fileId + ''/content'', req.user.box.accessToken)
.then(function(response) {
boxViewerRequest(''documents'', {url: response.request.href}, ''POST'')
.then(function(response) {
boxViewerRequest(''sessions'', {document_id: response.body.id}, ''POST'')
.then(function(response) {
console.log(response);
});
});
});
};
Este es el código de solicitud:
var baseContentURL = ''https://api.box.com/2.0/'';
var baseViewerURL = ''https://view-api.box.com/1/'';
function boxContentRequest(url, accessToken) {
return new Promise(function (resolve, reject) {
var options = {
url: baseContentURL + url,
headers: {
Authorization: ''Bearer '' + accessToken,
}
};
request(options, function (err, res) {
if (err) {
return reject(err);
} else if (res.statusCode !== 200) {
err = new Error("Unexpected status code: " + res.statusCode);
err.res = res;
return reject(err);
}
resolve(res);
});
});
}
function boxViewerRequest(url, body, method) {
return new Promise(function (resolve, reject) {
var options = {
method: method,
url: baseViewerURL + url,
headers: {
Authorization: ''Token '' + config.box.viewerApiKey
},
json: body
};
request(options, function (err, res, body) {
if (err) {
return reject(err);
} else if (res.statusCode !== 200 && res.statusCode !== 201 && res.statusCode !== 202) {
err = new Error("Unexpected status code: " + res.statusCode);
err.res = res;
return reject(err);
}
resolve(res, body);
});
});
}
Cualquier idea sería apreciada.
A partir de cada devolución de llamada, deberá devolver la nueva promesa:
exports.viewFile = function(req, res) {
var fileId = req.params.id;
boxContentRequest(''files/'' + fileId + ''/content'', req.user.box.accessToken)
.then(function(response) {
return boxViewerRequest(''documents'', {url: response.request.href}, ''POST'');
})
.then(function(response) {
return boxViewerRequest(''sessions'', {document_id: response.body.id}, ''POST'');
})
.then(function(response) {
console.log(response);
});
};
La promesa que se devuelve con la llamada .then()
se resolverá con el valor de la promesa "interna", para que pueda encadenarlos fácilmente.
Patrón genérico
somePromise.then(function(r1) {
return nextPromise.then(function(r2) {
return anyValue;
});
}) // resolves with anyValue
||
/||/
//
somePromise.then(function(r1) {
return nextPromise;
}).then(function(r2) {
return anyValue;
}) // resolves with anyValue as well