如何创建一个新的承诺?

How to create a new promise?

好吧,我知道人们必须 return 一个承诺,而不是承诺传递承诺的结果。

但是我似乎无法实现这个,说我有一个像这样的成员方法:

CreateNextBatch() {
  this.orders.clear();
  let maxNum = this.maxNum;
  let counter = this.orderCounter;
  let CreateThem = (counter, r) => {
    if (r >= 0) {
      //Order.find() finds an entry in a database
      Order
        .find({orderNr: counter.fullNumber()})
        .then(function(orders) {
          console.log("created order " + counter.fullNumber().toString());
          let num = r;
          if (orders.length === 0) {
            this.OpenOrder(counter.fullNumber()); 
            //adds order to this.orders
            num -= 1;
          }
          counter.nextNumber();
          return CreateThem(counter, num);
        }.bind(this))
        .catch (function (err){
          console.log(err);
          return false;
        });
    } else {
      return true;
    }
  };
  return () => {CreateThem(counter, maxNum);};
}

基本上它以递归方式创建订单,在找到 this.MaxRequests 个空点后终止,然后将它们放在 this.orders

下的列表中

现在我调用了这个函数:

initialLoader.CreateNextBatch().then(function (success) {
  console.log(success);
  console.log("loaded");
  initialLoader.initializeBatch();
});

但是这失败了:

 TypeError: initialLoader.CreateNextBatch(...).then is not a function
    at LoadExternDatabase...

为什么这不起作用?我还不明白什么?


编辑:我还尝试用新的承诺替换 return:

  return new Promise((resolve, reject) => {
    CreateThem(counter, maxRequests);
    resolve();
  });

然而,这会立即执行解析,而不是等待 CreateThem 完成。也不直接通过 return CreateThem.bind(this, counter, maxRequests);

的函数
return new Promise((resolve, reject) => {
   globalVarKeep = resolve;
   globalVarBreak = reject;
  });

在此之前,您会有一些代码在等待一个承诺或一个事件,上面写着:-

    CreateThem(counter, maxRequests);
    globalVarKeep();

    CreateThem(counter, maxRequests).then(globalVarKeep);

如果合适的话。

函数 initialLoader.CreateNextBatch() return 是一个函数,不是一个承诺,你应该这样做:initialLoader.CreateNextBatch()()

函数 CreateThem 可以 return 如果 this.maxNum >= 0 并且根据递归承诺为真或假。但并不总是保证 return 一个承诺。 () => {CreateThem(counter, maxNum);}; 也没有 return 任何东西。您可以尝试以下方法:

CreateNextBatch() {
  this.orders.clear();
  let maxNum = this.maxNum;
  let counter = this.orderCounter;
  let CreateThem = (counter, r) => {
    if (r >= 0) {
      //Order.find() finds an entry in a database
      //you can return a promise here
      return Order
        .find({orderNr: counter.fullNumber()})
        .then(function(orders) {
          console.log("created order " + counter.fullNumber().toString());
          let num = r;
          if (orders.length === 0) {
            this.OpenOrder(counter.fullNumber()); 
            //adds order to this.orders
            num -= 1;
          }
          counter.nextNumber();
          return CreateThem(counter, num);
        }.bind(this))
        .catch (function (err){
          console.log(err);
          return false;
        });
    } else {
      return Promise.resolve(true);
    }
  };
  //you are not returning CreateThem here
  return () => {return CreateThem(counter, maxNum);};
}

你应该 resolve 在异步操作完成后一个承诺。

例如:

function test() {
    return new Promise((resolve, reject) => {
        setTimeout(() => { 
              // Resolved here! 
              // Because asynchronous function `setTimeout` ends here
             resolve();  
         }, 1000);
    })
}

在您的代码中,如果 r >= 0,它将再次在数据库中找到一个条目,直到 r 小于 0,因此它在 else 块结束:

 if (r >= 0) {
    // ...
 } else { 
   // ends here
  }

也许您可以将代码更改为:

CreateNextBatch() {
   return new Promise((resolve, reject) => {
      this.orders.clear();
      let maxNum = this.maxNum;
      let counter = this.orderCounter;
      let CreateThem = (counter, r) => {
        if (r >= 0) {
          //Order.find() finds an entry in a database
          Order
            .find({orderNr: counter.fullNumber()})
            .then(function(orders) {
              console.log("created order " + counter.fullNumber().toString());
              let num = r;
              if (orders.length === 0) {
                this.OpenOrder(counter.fullNumber()); 
                //adds order to this.orders
                num -= 1;
              }
              counter.nextNumber();
              return CreateThem(counter, num);
            }.bind(this))
            .catch (function (err){
              console.log(err);
              reject(err);
            });
        } else {
          resolve(true);
        }
      };
});

//   return () => {CreateThem(counter, maxNum);};
}