简体   繁体   English

如何创建新的承诺?

[英]How to create a new promise?

Well I understand that one would have to return a promise, and not the result of a promise to pass promises around. 好吧,我知道,一个人必须返回一个承诺,而不是一个将承诺传递出去的结果。

However I seem to be unable to implement this, say I have a member method like: 但是我似乎无法实现这一点,说我有一个像这样的成员方法:

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);};
}

Basically it creates orders in a recursive fashion, terminating after finding this.MaxRequests empty spots and then puts them together in a list under this.orders 基本上,它以递归的方式创建订单,找到后终止this.MaxRequests空点,然后将它们放到this.orders下的列表中

Now I called this function by: 现在,我通过以下方式调用此函数:

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

However this fails: 但是,这失败了:

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

Why isn't this working? 为什么这不起作用? What am I not understanding yet? 我还不了解什么?


Edit: I've also tried to replace the return by a new promise: 编辑:我也试图用新的诺言代替回报:

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

However this executes the resolve immediatelly, instead of waiting for CreateThem to complete. 但是,这将立即执行解析,而不是等待CreateThem完成。 Nor directly the function by return CreateThem.bind(this, counter, maxRequests); 也不能直接通过return CreateThem.bind(this, counter, maxRequests);函数return CreateThem.bind(this, counter, maxRequests);

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

Before that you would have had some code waiting for a promise or an event that says: - 在此之前,您将需要一些代码来等待一个承诺或事件,该事件说:-

    CreateThem(counter, maxRequests);
    globalVarKeep();

or 要么

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

If that's appropriate. 如果合适的话。

The function initialLoader.CreateNextBatch() returns a function, not a promise, you should do: initialLoader.CreateNextBatch()() 函数initialLoader.CreateNextBatch()返回一个函数,而不是initialLoader.CreateNextBatch()() ,您应该这样做: initialLoader.CreateNextBatch()()

The function CreateThem can return true if this.maxNum >= 0 and a promise of true or false depending on the recursion. 如果this.maxNum > = 0,则函数CreateThem可以返回true,并且根据递归可以返回true或false。 But doesn't allways guaranteed return a promise. 但是并不总是保证退还诺言。 And () => {CreateThem(counter, maxNum);}; () => {CreateThem(counter, maxNum);}; doesn't return anything either. 也不会返回任何东西。 You could try the following: 您可以尝试以下方法:

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);};
}

You should resolve a promise after the asynchronous operation done. 异步操作完成后,您应该resolve一个Promise。

For example: 例如:

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

In your code, if r >= 0 , it will find an entry in database again until r less than 0 , so it ends at else block: 在您的代码中,如果r >= 0 ,它将再次在数据库中找到一个条目,直到r小于0为止,因此它在else块处结束:

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

Maybe you could change your code to: 也许您可以将代码更改为:

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);};
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM