首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在node.js中同步调用

在node.js中同步调用
EN

Stack Overflow用户
提问于 2014-12-22 16:11:19
回答 1查看 65关注 0票数 1

我有以下方法:

代码语言:javascript
复制
var get = function(query_para,callback) {

    var queryParams = query_para;
    var timestamp ;
    var some_Data = {};
    var data;

    request({url:"http://some-url.com/q?", qs:queryParams}, function(err, response, body) {
        if(err) { console.log(err); return; }
        console.log(body);
        var data = JSON.parse(body);

        some_Data.count = data.count; 

        console.log("Returned data: "+some_Data.count);

         callback(null,some_Data);
    });

};

我想把这个方法调用两次,并结合它们的结果。我通过以下方式使用回调实现了它:

代码语言:javascript
复制
get({ start: '2014/09/13-10:00:00', end: '2014/09/13-11:00:00', format: 'json' }, function(err, result1){
    get({ start: '2014/09/13-11:00:00', end: '2014/09/13-12:00:00', format: 'json' }, function(err, result2){
        console.log("r1:: "+result1.count);
        console.log("r2:: "+result2.count);
    });
});

有什么更好的方法让它同步吗?我读到了一些东西(承诺和同步客户端),但我不明白。怎样才能两次调用该函数并结合它们的结果?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-22 16:29:10

首先,看起来您的代码并不是同步的。我建议让它保持异步,并使用像Q这样的承诺库。首先,确保安装了Q:

代码语言:javascript
复制
npm install q

从您的get函数中返回一个承诺:

代码语言:javascript
复制
var get = function(query_para) {

    var queryParams = query_para;
    var timestamp ;
    var some_Data = {};
    var data;
    //Use q
    var Q = require("q");

    //define a deferred that will be resolved later
    var deferred = Q.defer();

    request({url:"http://some-url.com/q?", qs:queryParams}, function(err, response, body) {
        if(err) { console.log(err); return; }
        console.log(body);
        var data = JSON.parse(body);

        some_Data.count = data.count; 

        console.log("Returned data: "+some_Data.count);

        //resolve the deferred here
        deferred.resolve(some_Data);
    });

    //return the promise
    return deferred.promise;
};

从调用get函数的代码中:

代码语言:javascript
复制
var q = require("q");
var promiseArr = [];
//First promise to your get function
promiseArr.push(get({ start: '2014/09/13-10:00:00', end: '2014/09/13-11:00:00', format: 'json'}));
//Second promise
promiseArr.push(get({ start: '2014/09/13-11:00:00', end: '2014/09/13-12:00:00', format: 'json' }));

//Use q.all to call a callback when all promises in the array are resolved:
q.all(promiseArr).then(function (results) {
   //First item is the data resolved from the first promise in the array
   console.log("r1:: "+results[0].count);
   //Second item is data resolved from second promise
   console.log("r2:: "+results[1].count);
});
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27606284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档