javascript - 如何使用reduce正确链接promise

标签 javascript node.js promise dropbox

我有一个系统想要使用 API 在 Dropbox 中创建许多文件夹,但是我似乎尝试一次创建所有文件夹,这会导致生成错误,表明我从 Dropbox 执行了太多写入操作。

我的代码如下,首先使用reduce来创建多个我认为是链接的 promise 。在这些 promise 中,调用了 add 函数,该函数将案例上传到 mongodb,然后为其创建一个 dropbox 文件夹,但这会导致限制错误..

bulkAdd: function (req, callback) {
  issues = []
  i = 1

  req.reduce((promise, audit) => {
    return promise.then(_ => this.add(audit, function(err,data){
      if (err){
        console.log('\n'+i+ ' ' + data.scanner_ui + '\n');
      }
    }));
  }, Promise.resolve()).catch(error => {console.log(error)});
},

add: function (req, callback) {
  delete req.status
  var audit = new Audit(req);
  if (req['status_value'] != undefined && req.status_value != ''){
    console.log(req['status_value'])
    audit.status = [{
      status_value : req['status_value'],
      status_notes : req['status_notes'],
      status_date : req['status_date'],
    }]
  }

  audit.save(function (err, data) {
    if (err) {
      callback(err, data)
    }
    else {
        return dropbox_functions.createFolder(data.ui)
          .then(response => {console.log(response)}, error=> {console.log('\n\n\n',error.error.error)})
        .catch(error => console.log(error))
    }
  }); 

},

最佳答案

因此,您当前问题中的问题来自于您的 add 函数没有返回值,我只看到它返回未定义。

如果 Promise 在其 then/catch block 中返回除 Promise 以外的内容,它将将此输入用于以下函数,并且不会等待任何完成之前要运行的内部流程

如果在您的 then/catch block 中,您将返回一个 Promise,它会在继续下一个 then block 之前等待,因此按顺序处理您的请求。

现在,在您当前的代码中,我相信最简单的方法是在您的reduce中处理解析,因为您似乎已经被回调句柄困住了。

req.reduce((promise, audit) => {
  return promise.then(_ => new Promise( 
    function( resolve, reject) {
      this.add(audit, function(err,data){
        if (err){
          console.log('\n'+i+ ' ' + data.scanner_ui + '\n');
          reject( err );
          return;
        }
        resolve( data );
      });
    })
  );
}, Promise.resolve()).catch(error => {console.log(error)});

在这种情况下,promise 要么拒绝,要么解决本身。我选择分别提交errdata,这样如果出现错误,最后会得到处理,这样你就可以得到最后保存的数据成功

关于javascript - 如何使用reduce正确链接promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53708437/

相关文章:

javascript - Ajax 无法用于登录检查

javascript - Chrome 时间轴中的红线是什么意思?

node.js - Mongoose 查询,选择 10 个最近的文档而不改变顺序

node.js - 使用 sequelize/node js 进行层次结构查询

javascript - 有什么方法可以同步解决 promise 吗? (或者可以的替代库)

javascript - 从 YOUTUBE URL 获取视频 ID,然后将其插入文本区域

javascript - 如何在不使用 Google Forms 的情况下将 HTML 表单提交到 Google Sheets

javascript - ExpressJS + MongoDB - 登录/注册方法

javascript - 类型错误 : Cannot read property 'body' of undefined after POST (MEAN)

javascript - 将 $promise 数据放入 Javascript 数组中