【问题标题】:How to get promise.response to return an API’s response?如何让 promise.response 返回 API 的响应?
【发布时间】:2019-06-12 16:55:55
【问题描述】:

TLDR:我的 promise.response 需要在 API 调用和 promise 中调用。

我正在尝试通过简单 Express.js 服务器的 Promise 从 API 调用中获取返回值。

这似乎是一个有很多问题的话题,但我还没有成功地使实现适应这种情况。我也试过:

  • 将 API 调用放在 resolve() 中
  • 异步/等待实现(愿意重温)

以下是相关代码的基本结构。问题所在的部分上方有一条评论。

承诺

const externalModule = require('<route to module>');

let promise = new Promise(function(resolve,reject) {
    // This is probably where the problem is
    let returnValue = externalModule.apiCall(parameters);
    resolve(returnValue);
});

promise.then(function(returnValue) {
    console.log(returnValue);
});

外部模块

module.exports = {
    apiCall: function(parameters) {
        apiCall(
            parameters,
            function(err, response) {
                if (err) {
                    console.error(err);
                    return;
                } else {
                    console.log("success");
                    return response
                }
            }
        )
    }
};

如果代码运行正常,我们会看到两个字符串。一个来自 API 调用内部(“成功”),另一个来自它的返回值。因为 undefined 出现在“成功”之前,我们知道 resolve 函数在它上面的函数返回之前已经触发了。

Shell 中的日志

> undefined
> "success"

【问题讨论】:

  • 你应该让外部模块返回一个承诺。 resolve() 不会神奇地等待返回值
  • 您的内部 API 调用似乎是异步的,您忽略了它。您在这里有几个选择,包括将resolvereject 传递给apiCall 并在if 的相应子句中调用这两者或使apiCall 返回承诺本身。这里的主要错误是您试图通过将 apiCall 包装在另一个与其调用者同步的调用周围来隐藏 apiCall 的异步性质。

标签: javascript express promise


【解决方案1】:

您没有提供一种方法来使用来自 api 调用的响应。将其转换为 Promise,然后使用它。

module.exports = {
  apiCall: function(parameters) {
    return new Promise((res, rej) => {
      apiCall(
        parameters,
        function(err, response) {
          if (err) {
            rej(err);
          } else {
            res(response);
          }
        }
      )
    });
  }
};

那就这样用吧

let promise = externalModule.apiCall(parameters);

【讨论】:

    猜你喜欢
    • 2020-10-07
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多