javascript - 具有 API 和数据库查询的 Node.js Promise Chain

标签 javascript node.js api promise

我对整个 Promise 业务还很陌生,正在与他们一起尝试我的项目。
不,我需要查询外部 API,在响应中查找多个项目,用它们对我自己的数据库进行其他检查,当所有这些都完成后,需要自行解决整个 promise 。
我还需要在标记点再次调用我的数据库并做出另一个 promise 。它们是相互独立的,但“父” promise 只有在两者都得到解决时才应得到解决。
我在这里一堵墙,可能需要一些关于将多个 promise 与多个项目链接起来的一般性解释。
也许我只是理解这里普遍错误的东西...... 这是到目前为止我的代码(缩短为...):

'use strict';

import rp from 'request-promise';
import _ from 'lodash';

var Import = {
  init: function(user, options) {
    return new Promise((resolve, reject) => {
      rp.get("...") // call to external API
        .then((res) => {
          ...
          resolve();
        });
      ...
    });
  },
  run: function() {
    return new Promise((resolve, reject) => {
      ...

      rp.get(...) // call to external API
        .then((res) => {
          var events = JSON.parse(res).data;
          var promises = [];

          for (var i = 0; i < events.length; i++) {

            promises.push(new Promise((resolve, reject) => {
              ...

              Location.findOneAndUpdateAsync(...)
                .then((loc) => {
                  events[i].location = loc._id;
                  resolve();
                })
                .catch((err) => {
                  console.error(err);
                  reject();
                });

              // I need even another call to my database here later with another promise
            }));
          }
          return Promise.all(promises)
            .then(() => {
              console.log("all promises resolved");
              resolve(events);
            });
        })
        .catch((err) => {
          console.error(err);
          reject(err);
        });
    });
  }
};

最佳答案

您可以通过不违反Promise constructor anti-pattern来极大地简化您的代码。 - 您调用的函数已经返回 promise ,因此您应该利用这些。

然后,使用 Array.prototype.map 消除 for/push 循环:

var promises = events.map(function(event) {
    return Location.findOneAndUpdateAsync(...)
            .then((loc) => event.location = loc._id);
});

您说过要进行两组调用,但由于它们是独立的,您不妨使用另一个 .map 调用:

var promises2 = events.map(function(event) {
    return ...
});

然后您只需等待所有这些并返回您的 events 对象:

return Promise.all(promises.concat(promises2)).then(() => events);

不需要所有这些 .catch block - 您应该让错误向上传播。

如果(根据您的评论)两个内部调用具有依赖性,您可以尝试以下操作:

var promises = events.map(function(event) {
    return Location.findOneAndUpdateAsync(...)
           .then((loc) => {
               event.location = loc._id;
               if (condition) {
                   return XXXOtherFunctionReturningPromise();
               }
           });
});

[显然,然后消除上面的 .concat 调用]

关于javascript - 具有 API 和数据库查询的 Node.js Promise Chain,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35413269/

相关文章:

javascript - 需要div被下推

javascript - 如何使用javascript在Azure SQL Server上执行操作?

javascript - NodeJS - 从 Google Drive 下载

node.js - X509_check_private_key :key values mismatch error: DPS , 物联网集线器

node.js - 如何为 express.js 服务器设置 SSL 证书?

python - python是facebook开发的稳定平台吗?

javascript - 为什么 String.prototype 里面的 'this' 指的是对象类型,而不是字符串类型?

javascript - 如何为不仅仅是文本自定义 Bootstrap typeahead 布局/功能?

api - 使用 bash curl 和 oauth 返回谷歌应用程序用户帐户数据?

python - NANOPOOL API 到 Python 请求