sincronas promesas programacion funciones encadenamiento ejecucion controlar asincronia asincrona anidadas javascript node.js request promise

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