当前位置: 首页 > 知识库问答 >
问题:

删除嵌套promise

娄嘉石
2023-03-14

我不熟悉promise和使用NodeJS中的请求和promise编写网络代码。

我想删除这些嵌套的promise,并将它们链接起来,但我不确定该如何做/这是否是正确的方式。

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);
      });
    });
}

如有任何见解,将不胜感激。

共有2个答案

於乐
2023-03-14

Promise.prototype.then旨在返回另一个promise,以便您可以将它们链接起来。

传递给的处理函数。然后()可以返回一个正常的值,如数字、字符串或对象,这个值将被传递给的下一个处理程序。然后()

一个选项是让box ViewerResestSync成为一个返回响应对象的同步函数:

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);
    })

但是当然,您的box ViewerRequest是异步的,并返回一个promise。在这种情况下,传递给的处理函数也可以返回一个完全不相关的Promise。这个新promise是同步执行的,一旦它被解析/拒绝,它的结果就会传递给下一个处理程序。

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令人困惑,但底线是:Promise.prototype。然后将始终返回一个promise对象,但传递给Promise.prototype的处理程序函数。然后可以返回任何内容,甚至是未定义的,甚至是另一个promise。然后将该值或已解析promise的值传递给下一个处理程序函数。

唐元凯
2023-03-14

在每次然后回调中,您都需要返回新promise:

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()调用返回的promise将使用“内部”promise的值进行解析,这样您就可以轻松地将它们链接起来。

通用模式:

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

 类似资料:
  • 问题内容: 我是诺言和使用NodeJS中的请求和诺言编写网络代码的新手。 我想删除这些嵌套的Promise,而是将它们链接起来,但是我不确定我将如何处理它/这是否是正确的方法。 这是请求代码: 任何见识将不胜感激。 问题答案: 在每个回调中,您都需要 返回 新的Promise: 调用返回的承诺然后将使用“内部”承诺中的值进行解析,以便您可以轻松地链接它们。 通用模式:

  • 问题内容: 我是诺言和使用NodeJS中的请求和诺言编写网络代码的新手。 我想删除这些嵌套的Promise,而是将它们链接起来,但是我不确定我将如何处理它/这是否是正确的方法。 这是请求代码: 任何见识将不胜感激。 问题答案: 在每个回调中,您都需要 返回 新的Promise: 调用返回的承诺然后将使用“内部”承诺中的值进行解析,以便您可以轻松地链接它们。 通用模式:

  • 问题内容: 我一直试图在Java中编写一个正则表达式以删除下面括号中的所有内容,同时保留其他所有内容。 注意,括号可以嵌套,这就是为什么我的模式失败的原因 。有人能帮我吗?下面我试过了: 但这打印: d4 Nf6 2. c4 g6 3. Nc3 Bg7 4. e4 d6 5. Nf3 OO 6. Be2 e5 7. dxe5 dxe5 8. Qxd8 Rxd8 9. Bg5 Nbd7 10. OO

  • 我正在使用ElasticSearch5.4,试图从嵌套数据类型中删除一个元素。 我有以下映射: 我在《邮递员》中尝试过以下内容: localhost:9200/asset/bookmark/20976/_update?pretty 但我得到以下错误: 我在StackOverflow[1][2]的几个不同问题中遵循了这些建议,但没有成功。 嵌套对象是有效的,因为我已经用数据填充了它。此外,值也是有效

  • 问题内容: 我想从我的redux状态中删除一个元素。我使用无缝不可变及其API对状态进行操作。但是我找不到在嵌套状态时删除元素的任何好方法。 所以我要删除的元素是: 谢谢! 问题答案: 有时我也陷入了类似情况。 因此,根据redux docs ,更新嵌套对象的方式是:- 但是由于数组处于状态,这会使您的工作更加困难。 因此,有两种方法可以执行此操作。 第一种方式(困难的方式) 自己创建一个新对象并