Javascript 删除嵌套承诺
我不熟悉承诺和使用NodeJS中的请求和承诺编写网络代码 我想删除这些嵌套的承诺,并将它们链接起来,但我不确定该如何做/这是否是正确的方式Javascript 删除嵌套承诺,javascript,node.js,request,promise,Javascript,Node.js,Request,Promise,我不熟悉承诺和使用NodeJS中的请求和承诺编写网络代码 我想删除这些嵌套的承诺,并将它们链接起来,但我不确定该如何做/这是否是正确的方式 exports.viewFile = function(req, res) { var fileId = req.params.id; boxContentRequest('files/' + fileId + '/content', req.user.box.accessToken) .then(function(response) {
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);
});
});
});
};
这是请求代码:
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);
});
});
}
任何洞察都将不胜感激。从每次
然后
回调中,您需要返回新的承诺:
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);
});
};
然后,.then()
调用返回的承诺将使用“内部”承诺的值进行解析,这样您就可以轻松地将它们链接起来
通用模式:
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
Promise.prototype.then
设计用于返回另一个承诺,以便您可以链接它们
传递给.then()
的处理程序函数可以返回一个正常值,如数字、字符串或对象,该值将传递给的下一个处理程序。then()
一个选项是让boxViewerRequestSync
成为一个同步函数,返回响应
对象:
boxContentRequest('files/' + fileId + '/content', req.user.box.accessToken)
.then(function(response) {
return boxViewerRequestSync('documents', {url: response.request.href}, 'POST')
})
.then(function(response) { // this `response` is returned by `boxViewerRequestSync`
return boxViewerRequestSync('sessions', {document_id: response.body.id}, 'POST')
})
.then(function(response) {
console.log(response);
})
当然,您的boxViewerRequest
是异步的,并返回一个承诺。在这种情况下,传递给的处理函数也可以返回一个。这个新的承诺是同步执行的,一旦它被解析/拒绝,它的结果就会传递给下一个处理程序
boxContentRequest('files/' + fileId + '/content', req.user.box.accessToken)
.then(function(response) {
return boxViewerRequest('documents', {url: response.request.href}, 'POST')
})
.then(function(response) { // this `response` is the result of resolving the promise returned by `boxViewerRequest`
return boxViewerRequest('sessions', {document_id: response.body.id}, 'POST')
})
.then(function(response) {
console.log(response);
})
跟踪所有承诺令人困惑,但底线是:Promise.prototype。然后
将始终返回一个承诺对象,但传递给Promise.prototype的处理程序函数。然后
可以返回任何内容,甚至是未定义的,甚至是另一个承诺。然后将该值或已解析承诺的值传递给下一个处理程序函数。您可能会感兴趣。使用这个库,您可以保存一些代码,将请求包装成承诺。