我试图将两个异步数据源(它们中的每一个通过POST请求到达我的服务器并且具有公共的,否则唯一的ID)汇集在一起。要回答两个POST请求中的任何一个,我需要两个POST请求提供的数据。我可以使用什么数据结构,库等让每个POST处理程序等待其他值?
说明我的代码问题:我有两个函数,让我们称之为back
和front
,这些函数在任意时间调用:
var synchronizer = //what I'm looking for
function front(req) {
var id = req.data.id
var frontValue = req.data.value;
synchronizer.supplyFrontValue(id, frontValue).then(function(backValue){
req.send("The product is " + (frontValue*backValue));
});
// or alternatively, instead of a promise, use a callback:
// synchronizer.supplyFrontValue(id, frontValue, function(backValue){
// req.send("The product is " + (frontValue*backValue));
// });
}
function back(req) {
var id = req.data.id
var backValue = req.data.value;
synchronizer.supplyBackValue(id, backValue).then(function(frontValue){
req.send("The quotient is " + (frontValue/backValue));
});
}
答案 0 :(得分:1)
你可以使用promises。每个较新的浏览器都支持原生承诺(请参阅http://caniuse.com/#feat=promises),其他人可以使用回退库。
示例:
var request1 = new Promise(function(resolve) {
doAjaxRequest("someurl", function(payload) {
resolve(payload);
});
});
var request2 = new Promise(function(resolve) {
doAjaxRequest("someotherurl", function(payload) {
resolve(payload);
});
});
Promise.all([request1, request2]).then(function(payloads) {
console.log("All my payload", payloads);
});
答案 1 :(得分:0)
var synchronizer = {
data:{},
frontValue:function(id,value,cb){
var data = this.data;
if(data[id]){
data[id].front = value;
if(data[id].hasOwnProperty('back')){
//in case we have multiple calls of frontValue
//make sure we have one back value in data
data[id].cb(data[id].front,data[id].back);
cb(data[id].front,data[id].back);
delete data[id];
}
}else{
data[id] = {
front:value,
cb: cb
}
}
},
backValue:function(id,value,cb){
var data = this.data;
if(data[id]){
data[id].back = value;
if(data[id].hasOwnProperty('front')){
//in case we have multiple calls of backValue
//make sure we have one front value in data
data[id].cb(data[id].front,data[id].back);
cb(data[id].front,data[id].back);
delete data[id];
}
}else{
data[id] = {
back:value,
cb: cb
}
}
}
}
synchronizer.frontValue(1,'front',function(f,b){console.log('from front front=%s back=%s',f,b)})
synchronizer.backValue(1,'back',function(f,b){console.log('from back front=%s back=%s',f,b)})
我假设id是一个字母数字,它可以是一个对象的属性。此代码使用回调,可以编辑它以使用Deffered promises。虽然如上所述here已被废弃,但我无法找到一种简单的方法来使用新的承诺api。
答案 2 :(得分:0)
假设: 你可以设置一些合理的超时(TTL) 客户端异步发送POST
收到帖子后,您可以在数据库中注册Id。 db元素只需要id,data1和data2。 然后在注册id和相应的数据之后,在处理程序中调用setTimout,检查db1元素是否为data1和data2。 当你最终获得两个POST或TTL传递时,setTimeout中的函数会调用响应回调并返回每个POST。