合并两个异步请求的数据以回答这两个请求

时间:2016-01-29 09:42:50

标签: javascript node.js asynchronous

我试图将两个异步数据源(它们中的每一个通过POST请求到达我的服务器并且具有公共的,否则唯一的ID)汇集在一起​​。要回答两个POST请求中的任何一个,我需要两个POST请求提供的数据。我可以使用什么数据结构,库等让每个POST处理程序等待其他值?

编辑:

说明我的代码问题:我有两个函数,让我们称之为backfront,这些函数在任意时间调用:

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

3 个答案:

答案 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。