通过Q承诺链传递数据
piping data through Q promises chain
我正在链接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()
返回一个承诺,使email
和path
可用,以及在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更"自然"。
相关文章:
- $http中的Angular 1数据绑定承诺不起作用
- 如何在状态输入ui路由器时立即显示模板,然后当承诺被解决时显示数据
- 承诺和上传数据
- 访问 angularjs 工厂数据之外的承诺
- AngularFire $createUser 的承诺不返回包含用户数据的对象
- 在承诺函数从 pouchdb 填充数据之前触发 Ionic/Angular $watch的问题
- 如何在 ajax 请求中使用承诺对强制数据
- 在AngularUI路由器中访问多个承诺数据
- Angular JS承诺,JSON数据和有趣的时间
- 这是一种常见的模式吗?(返回数据而不是返回承诺)
- 通过承诺$q angularjs接收不完整的数据
- 从 Parse 承诺链返回数据
- 对没有返回数据的函数的承诺
- 角度“this”符号和来自服务的数据,带有承诺
- 蓝鸟承诺不会收到任何数据
- 角度承诺:如果可用,从缓冲区获取数据
- 刷新从承诺返回$http数据
- 在解决承诺 AngularJS/ES6 后检索存储在服务中的数据
- Angular 没有从 FS.readFile 获取带有承诺的数据
- 从承诺外部访问数据