2016-12-05 61 views
0

你好I'm做两个API调用做一些检查,我想两个通话完毕后,执行代码之后。执行代码2 API调用响应

var firstCall = request.get('/first', function (error, response, body) { 
    body = JSON.parse(body) 
}) 

var secondCall = request.get('/second', function (error, response, body) { 
    body = JSON.parse(body) 
}) 

理想我想要做这样的事情(使用下划线的例子)

if (_.isEmpty(firstCall) && _.isEmpty(secondCall)) { 
    // execute code here because both calls are empty. 
} 

我相信我需要实现承诺,但我不确定如何做到这一点的请求模块。谢谢。

回答

2

使用承诺:

(根据您共享我假设你使用的是旧版本节点的代码,所以我不会用ES6语法)

var Promise = require('bluebird'); 

function get(url) { 
    return new Promise(function(resolve, reject) { 
    request.get(url, function(error, response, body) { 
     if (error) return reject(error); 
     resolve(JSON.parse(body)); 
    }); 
    }); 
} 

var firstCall = get('/first'); 
var secondCall = get('/second'); 
Promise.all([firstCall, secondCall]).then(function (results) { 
    if(_.every(results, _.isEmpty)) { 
    // Do whatever you need to do 
    } 
}) 

ES6版本:

const get = url => new Promise((resolve, reject) => 
    request.get(url, (error, response, body) => 
    error ? reject(error) : resolve(JSON.parse(body)) 
) 
); 

const firstCall = get('/first'); 
const secondCall = get('/second'); 
Promise.all([firstCall, secondCall]).then(results => { 
    if(_.every(results, _.isEmpty)) { 
    // Do whatever you need to do 
    } 
}) 
+0

你好I'm使用节点7.0.0 what's错误的语法? – handsome

+0

@handsome:好吧,您没有使用任何ES6语法,所以我认为您使用的是旧版本的node.js。你正在使用'var'而不是使用'let' /'const',你没有使用箭头函数,你没有使用Promise等等。你的语法没有什么错,它只是在ES6之前,就是这样。 BTW:这个答案解决你的问题吗?如果是这样,你会介意将其标记为已接受吗? – Josep

+0

谢谢@josep为您解释。我需要为此使用模块吗?我可以更改代码来创建原始承诺吗? – handsome

0

可以使用async模块这一点。使用async.serial可以串行执行功能,使用async.parallel可以并行执行功能。您可以编写在回调函数中执行两个函数之后执行的代码。

0

您可以使用承诺或承诺模块,如异步。

如果前2个API是独立的,然后使用其他async.parallel可以使用 async.series。

async.parallel({ 
    firstCall: function(callback){ 
     request.get('/first', function (error, response, body) { 
      if(error){ 
       return callback(error); 
      }; 
      return callback(null,JSON.parse(body)); 
     }); 
    }, 
    secondCall: function(callback){ 
     request.get('/second', function (error, response, body) { 
      if(error){ 
       return callback(error); 
      }; 
      return callback(null,JSON.parse(body)); 
     }); 
    } 
}, 
function(err, results) { 
    if (_.isEmpty(results.firstCall) && _.isEmpty(results.secondCall))  { 
     // execute code here because both calls are empty. 
    } 
}); 

对于依赖API调用查找async.series;