首页 > 解决方案 > 计算 Promise.all 的复杂性

问题描述

我一直在努力让这个多个异步 nodejs 请求 api 工作,但不幸的是我无法让它们工作。

Index.js 代码:

service.get(
  "/restraunts",
  versionRoutes({
    "1.0.0": getRestrauntsList
  })
);

function getRestrauntsList(req, res, next) {
  console.log("Started getRestrauntsList");
  file1
    .appEnvironment(req, res, next)
    .then(function(result) {
      return file2.getRestrauntsList(req, res, next);
    })
    .then(function(result) {
      res.status(200).send(result);
      return;
    })
    .catch(function(errorResult) {
      res.status(500).send(errorResult);
      return;
    });
}

文件2.js

module.exports = {
  getRestrauntsList: function(req, res, next) {
    console.log("getRestrauntsList started..");
    var cities = [1, 2, 3, 4, 5];
    let restrauntsList = [];
    let urlArray = [];
    var restrauntsListPromise = cities.map(function(id) {
      return new Promise(function(resolve, reject) {
        var options = {
          method: "GET",
          url: "someurl/" + id + "/restaurants",
          headers: {
            "AUTH-TOKEN": "TOKEN"
          }
        };
        request(options, function(error, response, body) {
          if (error) {
            if ("message" in error) {
              errorMsg = error.message;
              var result = {
                status: "error",
                message: errorMsg
              };
            } else {
              var result = {
                status: "error",
                message: "Resource Timeout."
              };
            }
            reject(result);
            return promise;
          }
          console.log(
            "Response: " + JSON.stringify(response)
          );
          if (response.statusCode === 200 || response.statusCode === 201) {
            body = JSON.parse(body);
            if (body.success) {
              let result = {
                status: "success",
                data: body.result
              };
              resolve(result);
            } else {
              let result = {
                status: "error",
                message: body.error
              };
              reject(result);
            }
          } else {
            let result = {
              status: "error",
              message: body.error
            };
            reject(result);
          }
        });
      });
    });
    console.log('restrauntsListPromise:' + JSON.stringify(restrauntsListPromise));
    Promise.all(restrauntsListPromise).then(function(result) {
      var content = result.map(function(restraunts) {
        return restrauntsList.push(restraunts.body);
      });
      //  res.send(content);
      resolve({
        restrauntsList: restrauntsList
      });
      return promise;
    });
  },
};

理想情况下,我希望得到所有 API 的响应

约束列表承诺

然后使用 Promise.all 我应该迭代所有的承诺并制定我需要的对象。

然而,我的代码的响应是

restrauntsListPromise:[{},{},{},{},{}]

进而

响应:{"statusCode":200,"body":"{\"success\":true,\"res

响应:{"statusCode":200,"body":"{\"success\":true,\"res

响应:{"statusCode":200,"body":"{\"success\":true,\"res

响应:{"statusCode":200,"body":"{\"success\":true,\"res

响应:{"statusCode":200,"body":"{\"success\":true,\"res

理想情况下应该发生的是我应该能够将所有五个 api 调用的组合结果作为单个对象传递回这里的调用承诺

.then(function(result) {
    res.status(200).send(result);
    return;
  })

问题是getRestrauntsList方法完成执行,然后过了一段时间,我得到了 api 的响应。

标签: javascriptnode.jses6-promise

解决方案


问题是 getRestrauntsList 方法完成执行,然后过了一段时间,我得到了 api 的响应。

这是因为您没有从getRestrauntsList().

有几个项目需要解决才能使其发挥作用

1.删​​除未使用的变量

回报承诺;// 在 promise.all[] 和 request() 中

没有名为 的声明变量promise。因此,您可以将其删除。

2.访问.body而不是.data

您正在解析为resolve({status: "success", data: body.result});但是当您进行迭代时,您正在访问 using.body而不是.data. 您需要使用.data. 此外,您可以消除restrauntsList数组,因为您使用的是.map()

3.调用resolve()返回值。

您不能使用resolve()to 返回值,Promise.all[]因为您没有使用new Promise((resolve, reject) => { ... });. 默认情况下,promise 中的 return 将是一个 promise。所以,一个简单的回报就足够了。但是如果你想明确一点,你也可以使用返回Promise.resolve()

做出这些改变,

return Promise.all(restrauntsListPromise).then(function (result) {
  return {
    restrauntsList: result.map(function (restraunts) {
      return restraunts.data;
    })
  };

  //or using Promise.resolve();
  // return Promise.resolve({
  //   restrauntsList: result.map(function (restraunts) {
  //     return restraunts.data;
  //   })
  // });
});

推荐阅读