Javascript 从TypeScript中的回调返回值

Javascript 从TypeScript中的回调返回值,javascript,node.js,typescript,callback,Javascript,Node.js,Typescript,Callback,我在file Service.ts的typescrypt中有一个函数: export const doCallAuth = (username, password) => { var auth = new Auth({ url: '...', }); var status; auth.authenticate(username, password, function (err, user) { if (err

我在file Service.ts的typescrypt中有一个函数:

export const doCallAuth = (username, password) => {
    var auth = new Auth({
        url: '...',

      });

      var status;

      auth.authenticate(username, password, function (err, user) {
        if (err) {
          console.log(err);
          status = 'no';

        } else if (!user.uid) {
          console.log("user not found Error");
          status = 'no';
        } else if (user.uid) {
          console.log("success : user " + user.uid + " found ");
          status = 'yes';
        }
      });

      return status;
}
我通过以下方式调用此方法:

var result = Service.doCallAuth('test', 'test');
var result = await  Service.doCallAuth('test', 'test');
且变量结果未定义

我不知道为什么结果没有定义

有人能帮我吗

提前感谢。:)

试试这个

 export const doCallAuth = (username, password, callback) => {
        var auth = new Auth({
            url: '...',
        });
        var status;
        auth.authenticate(username, password, callback);
    }
    var result;
    Service.doCallAuth('test', 'test', function (err, user) {
        if (err) {
            console.log(err);
            status = 'no';
        } else if (!user.uid) {
            console.log("user not found Error");
            status = 'no';
        } else if (user.uid) {
            console.log("success : user " + user.uid + " found ");
            status = 'yes';
        }
        result = status;
    });

要从AJAX调用中获取值,需要使用
async
wait

    export const doCallAuth = async function(username, password) => {
        var auth = new Auth({
            url: '...',

          });

          var status;

          auth.authenticate(username, password, function (err, user) {
            if (err) {
              console.log(err);
              status = 'no';

            } else if (!user.uid) {
              console.log("user not found Error");
              status = 'no';
            } else if (user.uid) {
              console.log("success : user " + user.uid + " found ");
              status = 'yes';
            }
            return status;
          });


    }
通过以下方式调用此方法:

var result = Service.doCallAuth('test', 'test');
var result = await  Service.doCallAuth('test', 'test');

您可以使用承诺或回调模式

1。承诺

export const doCallAuth = (username, password) => {
  return new Promise((resolve, reject) => {
    var auth = new Auth({ url: "..." });
    auth.authenticate(username, password, (err, user) => {
      if (err) {
        reject(err);
      } else if (!user.uid) {
        reject(new Error("user not found Error"));
      } else if (user.uid) {
        console.log("success : user " + user.uid + " found ");
        resolve(user);
      }
    });
  });
};

Service.doCallAuth("test", "test")
  .then(user => {
    console.log("success : user " + user.uid + " found ");
  })
  .catch(e => {
    console.log(e);
  });
2。回调

export const doCallAuthCallBack = (username, password, callback) => {
  var auth = new Auth({ url: "..." });
  auth.authenticate(username, password, (err, user) => {
    if (err) {
      callback(err);
    } else if (!user.uid) {
      callback(new Error("user not found Error"));
    } else if (user.uid) {
      callback(null, user);
    }
  });
};

Service.doCallAuthCallBack("test", "test", (err, user) => {
  if (err) {
    console.log(err);
  } else {
    console.log("success : user " + user.uid + " found ");
  }
});

由于身份验证是一个异步函数,并且在调用该异步函数后立即返回状态,因此您正在得到未定义的结果。@Sohail:那么我该如何修复?它不起作用,结果未定义。我已编辑了我的答案,请试着这样做。当您调用Service.doCallAuth时,请传递回调函数。希望这能解决问题。它仍然不工作,状态未定义:)@JavaDevBeginner我已经更新了我的代码。请查收。如果有任何问题,请让我知道。仍然不工作:)工作正常。您可以通过异步/等待进行书写吗?:)只需将函数调用更改为
const result=await Service.doCallAuth(“test”、“test”)
,承诺处理异步/等待模式,并通过try/catch模式包装等待调用以捕获错误。