【问题标题】:Javascript: Promise returning instantly, rather than waiting for asynchronous process to finishJavascript:承诺立即返回,而不是等待异步进程完成
【发布时间】:2023-03-17 03:49:01
【问题描述】:

基本上,当我调用我的函数 getToken() 时,它应该从 api 返回承载 + 令牌。

我的问题是由于发生了异步过程,数据没有立即返回;所以在阅读以下资源时:

我的理解是,我需要以promise的形式返回我的响应,并设置一个超时时间,以确保返回考虑到服务器以响应的形式发回我的请求所花费的时间。

var request = require('request-promise');
var time = require('timers');
class Auth {
 getToken() {
   let options = {
     method: 'POST',
     uri: 'https://example.com/service/ep',
     body: {
       username: 'someUser',
       password: 'somePass'
     },
     json: true
   }
  request(options)
    .then(function (body) {
      // console.log(body)
      return new Promise((resolve) => {
        time.setTimeout(() => {
          resolve(body)
        },3000)
    });
  })
  .catch(function (err) {
    return err
  });
 }
}
module.exports = new Auth

不幸的是,当我在 node repel 中运行我的程序时,它什么也没返回,而且它似乎没有等待;当然,当我记录我的回复“console.log(body)”时,这似乎意味着我兑现承诺的方式一定有问题;我对承诺之类的东西很陌生。

可以与第二双眼睛一起使用。

【问题讨论】:

  • 你怎么打电话给getToken()?当您正确调用它时,您是否使用.then()?忘记这样的超时,它们不是你需要的,而且非常脆弱。
  • 目的是使用 getToken() 来返回不记名令牌,以便我可以发出其他请求来测试 API。我认为超时可能不是最好的方法。
  • 您绝对不应该依赖 setTimeout,当收到响应时,promise 应该会解决(然后调用)。我假设这是针对节点的,否则我会质疑您为什么不使用 whatwg-fetch?
  • 因为理论上您的代码看起来应该可以工作(尽管有 3 秒的延迟),您能否发布您尝试调用该函数的部分?
  • 你忘记了return的承诺,即return request(options)

标签: javascript authentication promise httprequest


【解决方案1】:

我的理解是,我需要以promise的形式返回我的响应,并设置一个超时时间,以确保返回考虑到服务器以响应的形式发回我的请求所花费的时间。

没有。您需要返回一个承诺(request 已经给了您一个),然后您返回承诺的代码需要 expect 一个承诺(并在其上调用 then() 以获取数据)。

您不需要任何时间延迟。


var request = require('request-promise');
var time = require('timers');
class Auth {
 getToken() {
   let options = {
     method: 'POST',
     uri: 'https://example.com/service/ep',
     body: {
       username: 'someUser',
       password: 'somePass'
     },
     json: true
   }
  return request(options);
 }
}
module.exports = new Auth

const auth = require("Auth");
auth.getToken().then(function (data) {
    console.log(data);
});

【讨论】:

  • 我误解了如何使用promises,至少我以为我是在第一个函数中处理它。从那时起,我编写了另一个函数来尝试处理响应。 makeAnotherRequest() { let token; this.getToken().then(function (data) { token = data; console.log('response from the server: ', data); }).catch(function (error) { console.log('error ', error) }); request.get('https://example.com/service/ep/207', { 'auth': { 'bearer': ${token}` } }); }` 目前正在处理错误情况。
猜你喜欢
  • 2018-03-05
  • 2020-04-22
  • 1970-01-01
  • 2019-10-20
  • 2018-03-02
  • 2019-03-20
  • 1970-01-01
  • 2018-08-01
  • 1970-01-01
相关资源
最近更新 更多