Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Nodejs变量在“后未定义”;等待“;_Javascript_Node.js_Promise_Async Await - Fatal编程技术网

Javascript Nodejs变量在“后未定义”;等待“;

Javascript Nodejs变量在“后未定义”;等待“;,javascript,node.js,promise,async-await,Javascript,Node.js,Promise,Async Await,我知道已经有类似的问题了。我保证我已经读过了;我就是不明白。我有一些简单的代码来获取第三方API服务的令牌: let tok = ''; const getToken = async () => { tok = await btt.get(); console.log(tok); }; getToken(); tok在控制台上始终是未定义的。我认为wait的全部意义在于,您的代码将暂停,直到特定的承诺得到解决或拒绝;我弄错了吗?下面是get函数: async get () {

我知道已经有类似的问题了。我保证我已经读过了;我就是不明白。我有一些简单的代码来获取第三方API服务的令牌:

let tok = '';
const getToken = async () => {
  tok = await btt.get();
  console.log(tok);
};
getToken();
tok
控制台上始终是
未定义的。我认为
wait
的全部意义在于,您的代码将暂停,直到特定的承诺得到解决或拒绝;我弄错了吗?下面是
get
函数:

async get () {
  this.paymentGateway.clientToken.generate({
    customerId: '5cdc7405da53494ee0f3bafe'
  }, (err, result) => {
    return new Promise((resolve, reject) => {
      if (result.success) {
        resolve(result.clientToken);
      } else {
        reject(result.errors);
      }
    });
  });
}
我已经被这个问题困扰了一段时间,并尝试了很多不同的方法。如果有人能帮忙,我将不胜感激


谢谢。

你从未解决过这个承诺。将最后一行更改为:

getToken().catch(console.error);

您的异步函数没有返回承诺。试试这个:

async get () {
  return new Promise((resolve, reject) => {
    this.paymentGateway.clientToken.generate({
      customerId: '5cdc7405da53494ee0f3bafe'
    }, (err, result) => {
      if (result.success) {
        resolve(result.clientToken);
      } else {
        reject(result.errors);
      }
    }
  });
}

例如:

const mockPaymentGateway={
clientToken:{
//随机成功或失败的模拟。
生成:(\ux,callback)=>callback(null,Math.random()>0.5{
成功:没错,
clientToken:“”
} : {
错误:[“我们没有钱。”
}),
}
}
//我假设您还有其他服务,但这里有一个例子
类服务{
建造商(paymentGateway){
this.paymentGateway=paymentGateway;
}
异步get(){
返回新承诺((解决、拒绝)=>{
this.paymentGateway.clientToken.generate({
客户ID:'5cdc7405da53494ee0f3bafe'
},(错误,结果)=>{
如果(结果、成功){
解析(result.clientToken);
}否则{
拒绝(结果错误);
}
});
});
}
}
//正在生成模拟数据。。。
const btt=新的SomeService(mockPaymentGateway);
设tok='';
const getToken=async()=>{
试一试{
tok=等待btt.get();
控制台日志(tok);
}捕获(e){
log('获取令牌时出错:',e);
}
};
document.querySelector('#get token').addEventListener('click',async()=>{
log(“获取令牌”);
getToken()
});

获取令牌
将您的通话包装在承诺内:

async get () {
  return new Promise((resolve, reject) => {
    this.paymentGateway.clientToken.generate({
      customerId: '5cdc7405da53494ee0f3bafe'
    }, (err, result) => {
      if (result.success) {
        resolve(result.clientToken);
      } else {
        reject(result.errors);
      }
    });
  });
}

下次尝试不发送您的客户端令牌;)(现在请求另一个是个好主意)您的get()没有返回任何内容ha…这不是客户端令牌。这是我们的dev DB.tonsteri…get()中的一个Mongo对象,它没有返回承诺吗?这很有效!非常感谢。但问题是;我认为我的原始代码返回了一个承诺;有什么问题?@boing您向回调函数返回了一个承诺,您没有从
get()
本身返回任何内容。不,您的原始代码称为a
this.paymentGateway.generate(选项,回调)。然后它没有返回任何内容,这意味着,默认情况下,它返回未定义的内容。您的回调返回了一个承诺,但您从未从回调本身获得结果。等等,再举个更好的例子。啊,我明白了!对
generate
的异步调用不在承诺范围内@boing,下面是一个工作示例