Promise.all()。then()转到catch()因为然后无法识别

时间:2017-04-03 17:42:07

标签: javascript node.js promise

代码运行良好,直到Promise.all,然后直接进入捕获,说'然后没有定义'。

我一直试图在数小时内没有成功:(。

欢迎任何帮助。

以下是代码的简化示例:

// Save
return new Promise((fulfillSave, rejectSave) => {
  // Get
  this._getObjects().then((object) => {
    var promises = [];

    // For each value
    object.values.forEach((value) => {
        promises.push(
          // Create promise
          new Promise((fulfill, reject) => {
            // Create MDB object + assign value
            valueMongoDB.value = value; 
            // Save
            valueMongoDB.save((err, results) => {
              if (err) {
                reject('Error in saving');
              } else {
                fulfill();
              }
            });
          })
        );
      });

      // Wait for all promises
      Promise.all(promises).then(() => {
        // Nothing to do
        fulfillSave();
      }, then((err) => {
        // Err
        rejectSave(err);
      }));
    }
  }).catch((err) => {
    rejectSave(`Error: ${err.message}`);
  });
});

提前致谢! 哔叽。

2 个答案:

答案 0 :(得分:3)

这是不正确的:

// Wait for all promises
Promise.all(promises).then(() => {
  // Nothing to do
  fulfillSave();
}, then((err) => {
// ^^^^--------------------------- error here
  // Err
  rejectSave(err);
}));

它正在尝试调用一个名为then的独立函数,并将其返回值传递给then返回的对象上的Promise.all

我认为你正在尝试连接失败处理程序。如果是这样,你没有说then,你只提供第二个功能:

Promise.all(promises).then(() => {
  // Nothing to do
  fulfillSave();
}, (err) => {
  // Err
  rejectSave(err);
}));

但是,当然,既然你没有使用该链的结果而你只是将第二个函数接收的单个参数传递给rejectSave,那么你可以直接传递rejectSave:< / p>

Promise.all(promises).then(() => {
  // Nothing to do
  fulfillSave();
}, rejectSave);

如果您告诉我们您的整体代码应该做什么以及它的输入是什么,我怀疑该代码可能是很多更简单。不必要地创建和嵌套承诺是很常见的,我怀疑这种情况正在发生。

例如,如果您只是想进行保存并取回一个承诺,该承诺将在成功完成后解决或在第一次失败时拒绝:

return this._getObjects()
  .then(objects => Promise.all(objects.map(value => {
      return new Promise((resolve, reject) => {
        // Create MDB object + assign value
        valueMongoDB.value = value; 
        // Save
        valueMongoDB.save((err, results) => {
          if (err) {
            reject('Error in saving');
          } else {
            fulfill();
          }
        });
      });
    })));

或者,如果我们为Mongo位给自己一个辅助函数:

function mongoSavePromise(value) {
  return new Promise((resolve, reject) => {
    // Create MDB object + assign value
    valueMongoDB.value = value; 
    // Save
    valueMongoDB.save((err, results) => {
      if (err) {
        reject('Error in saving');
      } else {
        fulfill();
      }
    });
  });
}

然后:

return this._getObjects()
  .then(objects => Promise.all(objects.map(mongoSavePromise)));

答案 1 :(得分:1)

避免使用Promise constructor antipattern

您的整个代码应该是一个简单的

return this._getObjects().then(object => {
    var promises = object.values.map(value => {
        // Create MDB object + assign value
        valueMongoDB.value = value; 
        // Save
        return valueMongoDB.save().catch(err => {
            throw 'Error in saving';
        });
    });
    // Wait for all promises
    return Promise.all(promises);
}, err => {
    throw `Error: ${err.message}`;
});

没有不必要的回调,没有错误的余地。顺便说一句,you shouldn't throw strings