在返回给用户之前等待回调完成

Wait for Callbacks to complete before returning to the user

我有一个动态案例,用户将 post 一组数据,我需要将这些数据插入数据库的不同行中。在向用户返回成功或失败之前,我如何等待回调完成。

我尝试使用 promise 但它 returns 这个

UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): TypeError: Cannot read property 'Symbol(Symbol.iterator)' of undefined (node:6216) DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

我的足迹与承诺

req.targetting.forEach(data => {
      let s = {};
      if (data.value == '' || data.value.length == 0) {
        s = 99;
      } else {
        s = data.status;
      }
      let promises =  new Promise((resolve, reject) => {
        XXX.upsertWithWhere(where clause,data, (err, data) => { // a loopback method
            if (err) {
              return reject(err);
            }
            return resolve(data);
          });
      });
      Promise.all(promises).then((err, data) => {
        if (err) {
          return callback(err);
        }
        callback(null, data);
      });
    });
  };

我考虑过将 promises 放在一边,但仍然出现与拒绝 ID 3 相同的错误

upsert 方法的签名

PersistedModel.upsertWithWhere([where], data, callback)

我想这样的事情应该没问题(我没有测试这段代码)

let promises = [];
req.targetting.forEach(data => {
let s = {};
if (data.value == '' || data.value.length == 0) {
  s = 99;
} else {
  s = data.status;
}
let promise =  new Promise((resolve, reject) => {
  XXX.upsertWithWhere(whereclause,data, (err, data) => { // a loopback 
  //method
  if (err) {
    return reject(err);
  }
    return resolve(data);
  });
});
promises.push(promise);
});
Promise.all(promises).then((data) => {
  return data;
})
.catch((err) => {
  return err;
});

您需要用另一种方法包装您的迭代。建立一个承诺列表,然后等待它解决。例如下面

function orgMethod(){
            let promises =[];
            req.targetting.forEach(data => {
                  let s = {};
                  if (data.value == '' || data.value.length == 0) {
                    s = 99;
                  } else {
                    s = data.status;
                  }
                  promises.push(new Promise((resolve, reject) => {
                    XXX.upsertWithWhere(where clause,data, (err, data) => { // a loopback method
                        if (err) {
                          return reject(err);
                        }
                        return resolve(data);
                      });
                  }));

                });
              };
     Promise.all(promises).then((err, data) => {
                    if (err) {
                      return callback(err);
                    }
                    callback(null, data);
                  });
        }