计算Promise.all

时间:2018-07-23 16:37:10

标签: javascript node.js es6-promise

我一直在努力使这个多个异步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;
    });
}

File2.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的响应
  

restrauntsListPromise

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

我的代码的响应是

  

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的响应。

2 个答案:

答案 0 :(得分:1)

  

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

这是因为您没有从getRestrauntsList()返回承诺。

只有少数几个项目需要解决才能使其正常工作

1。删除未使用的变量

  

回报承诺; //都位于promise.all []和request()

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

2。访问.body而不是.data

您以resolve({status: "success", data: body.result});的身份进行解析,但是在进行迭代时,您使用的是.body而不是.data。您需要使用.data。另外,由于您使用的是restrauntsList

,因此可以消除.map()数组

3。调用resolve()返回值。

您无法使用resolve()返回Promise.all[]内的值,因为您没有使用new Promise((resolve, reject) => { ... });创建承诺。默认情况下,承诺内的回报就是承诺。因此,简单的回报就足够了。但是,如果您想变得明确,也可以使用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;
  //   })
  // });
});

答案 1 :(得分:0)

您正在寻找

return Promise.all(restrauntsListPromise).then(function(result) { /*
^^^^^^ */
    var contents = result.map(function(restaurants) {
        return restaurants.body;
//      ^^^^^^^^^^^^^^^^^^^^^^^^
    });
    return {restaurantsList: contents};
//  ^^^^^^
});

您需要从getRestrauntsList方法返回promise链,您应该从map回调中返回值,而不是在数组上使用push,并且您需要返回来自then回调-没有resolve函数,因为您不在new Promise构造函数中,而您只需要回调API。