nodejs中request.post如何改为同步执行?

send.js模块代码:

var request=require('request');
var sendUrl=function(req,url){

console.log('请求参数:');
console.log(req.body);
var opts={
    url:url,
    form:req.body,
    headers: {
        'Cookie': 'JSESSIONID='+req.session.resPonseId
    }
};
var results={status:false,message:'调用接口失败'};
console.log(opts.url);
request.post(opts,function(err,response,body){
    console.log('返回结果:');
    if(!err && response.statusCode == 200){
        if(body!=='null'){
            results=JSON.parse(body);
        }
    }
})
return results;
console.log(results)

}
module.exports=sendUrl;

其它模块中调用 :
在其它模块处调用:
var results=sendUrl(url);
一直会显示:{status:false,message:’调用接口失败’}
如何把request.post改成同步的?

阅读 16.1k
4 个回答

request.post 是不能改成同步的。

但是你可以借助异步流程控制库来完成你的需求。
比如我用的when.js
//访问a网站

function a(){
    return when.promise(function(resolve,reject){
        request.post(opt,function(err,result){
            if(err){reject(err)}else{resolve(result)}
        })
    })
}
a.then(function(result){
    //result返回的结果
}).catch(function(err){
    //err这是错误返回
})
新手上路,请多包涵

用Promise。下面使用了ES7的async-await。

// 定义Promise函数
function post(opts) {
    return new Promise ((resolve, reject) => {
        request.post(opts,function(err,response,body){
            console.log('返回结果:');
            if(!err && response.statusCode == 200){
                if(body!=='null'){
                    results=JSON.parse(body);
                    resolve(results);
                }
            }
        });    
    });
}
//使用它
async function foo() {
    ......
    let result = await post(opts);
    return result;
}
新手上路,请多包涵

天生设计就是异步的,没法同步,除非你修改nodejs

为什么要同步呢? 我实在想象不到什么样的需求下,需要同步请求。。
promise 也好, 直接调用 callback 也好,不就行了吗?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏