通过Q承诺链传递数据

piping data through Q promises chain

本文关键字:数据 承诺 通过      更新时间:2023-09-26

我正在链接Q承诺:

Q(initialCall).then(someOtherCallThatUsesResultsFromPreviousResults)

调用通常意味着一个承诺的node.js http。获取对外部REST api的调用。路径是使用先前调用的信息构造的。同时,我还想从之前的调用中获取信息。链的最终结果应该是来自两个调用的数据合并到一个对象中。现在,信息的传递是通过附加的参数对象显式地完成的。有任何不需要显式传递额外参数的方法吗?

function jsonRequest(pathThatIsContructedBasedOnPreviousResults, object:any) {
  var deferer = Q.defer();
    var options = capsuleOptions;
    options.path = path;
    https.get(options, function (response) {
      response.on('data', function (d) {
        var parsedJson = JSON.parse(d);
        deferer.resolve({data: parsedJson, object: object});
      })}).on('error', function(e) {deferer.reject(e);});
    return deferer.promise;
}

的例子:

function getUserDetailsByEmail(email) {
    var userByEmailRequestPath = '/api/party?email=' + email;
    return jsonRequest(userByEmailRequestPath, email);
}

UserByEmail端点不返回电子邮件作为响应JSON的一部分,我仍然想在返回值中包含电子邮件

你的例子很难仿效。但据我所知,你想从两个来源获得信息。您可以将调用封装在接收外部参数的另一个函数中。我猜您正在寻找这样的内容:

function getJsonRequestExecutor( externalObject ) {
   return function( pathThatIsContructedBasedOnPreviousResults ) {
       ...
   };
}

那么你可以把它命名为:

Q(initialCall)
   .then( getJsonRequestExecutor( email ) );

如果我理解正确,您希望getUserDetailsByEmail()返回一个承诺,使emailpath可用,以及在https响应中返回的数据。

这可能有几种不同的方式;我能想到两个:

1。在getUserDetailsByEmail()中"预组合"一个对象,在jsonRequest()中增加数据,并返回承诺包装的

function jsonRequest(obj) {
    var dfrd = Q.defer(),
    var options = _.extend({}, capsuleOptions, {
        'path': obj.path
    });
    https.get(options, function (response) {
        response.on('data', function (d) {
            obj.data = JSON.parse(d);
            dfrd.resolve(obj);
        });
    }).on('error', function(e) {
        dfrd.reject(e);
    });
    return dfrd.promise;
}
function getUserDetailsByEmail(email) {
    return jsonRequest({
        email: email,
        path: '/api/party?email=' + email
    });
}

2。在jsonRequest()

获取异步数据后,在getUserDetailsByEmail()中"Post-compose"一个对象
function jsonRequest(path) {
    var dfrd = Q.defer();
    var options = _.extend({}, capsuleOptions, {
        'path': obj.path
    });
    https.get(options, function (response) {
        response.on('data', function (d) {
            dfrd.resolve(JSON.parse(d));
        });
    }).on('error', function(e) {
        dfrd.reject(e);
    });
    return dfrd.promise;
}
function getUserDetailsByEmail(email) {
    var path = '/api/party?email=' + email;
    return jsonRequest(path).then(function(data) {
        return {
            email: email,
            path: path,
            data: data
        };
    });
}

两个版本:

  • 你会看到下划线的_.extend()被用来防止capsuleOptions的污染。这与解决方案无关,只是良好的实践。
  • getUserDetailsByEmail()返回一个js普通对象的承诺,属性为.email, .path.data

您选择的两个版本中的哪一个(或完全不同的东西)可能由任何其他调用jsonRequest()所需的行为决定。在这方面,您可能会发现版本2更"自然"。