函数返回异步方法之前完成Node JS [英] Function returning before async method done Node JS

查看:130
本文介绍了函数返回异步方法之前完成Node JS的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前有一个从路由器调用的功能:



router.js:

  var result = Api.getUser(); 

console.log(Result:+ result);

api.js

  exports.getUser = function(req,result){

request.get({
uri:URL +'/ user / me /',
标题:{Authorization:'bearer'+ req.user.accessToken},
json:true
},function(e,r,body){

console.log e:+ e +body:%j,body);

if(e){

return{error:true};

} else {

return body;

}

});

};

我遇到的问题是我收到日志Result:undefined p>

有没有办法保持函数getUser不会返回,直到get完成的函数为止?

解决方案

你正在处理异步代码。有几种方法来解决这个问题。



有承诺



  // api.js 
var Promise = require('bluebird');
var request = require('request');
var getP = Promise.promisify(request.get.bind(request));

exports.getUser = function(accessToken){
return getP({
uri:URL +'/ user / me /',
headers:{授权: '('e''+ e +body)($($)$($)
json:true
} %j,body);
if(e){
return Promise.reject({error:true});
} else {
return Promise.resolve身体);
}
});
};

// main.js
api.getUser(req.user.accessToken)
.then(console.log.bind(console,Result:))
.catch(console.error.bind(console));



带回叫



  // api.js 
var request = require('request');

exports.getUser = function(accessToken,callback){
request.get({
uri:URL +'/ user / me /',
headers: {授权:'承载'+ accessToken},
json:true
},function(e,r,body){
console.log(e:+ e + %j,body);
if(e){
callback({error:true});
} else {
callback(null,body);
}
});
};

// main.js
api.getUser(req.user.accessToken,function(err,result){
if(err)return console.error(err);
console.log(Result:+ result);
});

承诺API的好处是,您只需要检查一次错误,在您的最终 .catch 处理程序。在回调方式中,如果您需要继续进行其他异步调用,那么您必须保持嵌套回调并检查 if(err)return console.error(err)单回拨。


I currently have a function that is called from my router:

router.js:

var result = Api.getUser();

console.log("Result: " + result);

api.js

exports.getUser = function(req, result) {

    request.get({
        uri: URL + '/user/me/',
        headers: {Authorization: 'bearer ' + req.user.accessToken},
        json: true
      }, function(e, r, body) {

        console.log("e: " + e + " body: %j", body);

            if(e) {

                return "{error: true}";

            } else {

                return body;

            }

    });

};

The problem I am having is that I am getting the log "Result: undefined" first.

Is there a way to hold the function getUser from returning until the function for get finishes?

解决方案

You are dealing with asynchronous code. There are a couple ways to solve this problem.

With A Promise

// api.js
var Promise = require('bluebird');
var request = require('request');
var getP = Promise.promisify(request.get.bind(request));

exports.getUser = function(accessToken) {
  return getP({
    uri: URL + '/user/me/',
    headers: {Authorization: 'bearer ' + accessToken},
    json: true
  }).spread(function(e, r, body) {
    console.log("e: " + e + " body: %j", body);
    if(e) {
      return Promise.reject("{error: true}");
    } else {
      return Promise.resolve(body);
    }
  });
};

// main.js
api.getUser(req.user.accessToken)
  .then(console.log.bind(console, "Result: "))
  .catch(console.error.bind(console));

With A Callback

// api.js
var request = require('request');

exports.getUser = function(accessToken, callback) {
  request.get({
    uri: URL + '/user/me/',
    headers: {Authorization: 'bearer ' + accessToken},
    json: true
  }, function(e, r, body) {
    console.log("e: " + e + " body: %j", body);
    if(e) {
      callback("{error: true}");
    } else {
      callback(null, body);
    }
  });
};

// main.js
api.getUser(req.user.accessToken, function (err, result) {
  if (err) return console.error(err);
  console.log("Result: " + result);
});

The nice thing about the promise API is that you only ever need to check for errors once, in your final .catch handler. In the callback style if you need to keep making additional asynchronous calls then you'll have to keep nesting callbacks and checking if (err) return console.error(err) in every single callback.

这篇关于函数返回异步方法之前完成Node JS的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆