javascript - 如何创造新的 promise ?

标签 javascript promise sails.js

嗯,我明白,一个人必须返回一个 promise ,而不是传递 promise 的 promise 的结果。

但是我似乎无法实现这个,假设我有一个成员方法,例如:

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...

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


编辑:我还尝试用新的 promise 替换返回:

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

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

的函数

最佳答案

您应该在异步操作完成后解决一个 promise 。

例如:

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

在你的代码中,如果r >= 0,它将再次在数据库中查找条目,直到r小于0,所以它结束于 else block :

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

关于javascript - 如何创造新的 promise ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47783801/

相关文章:

mysql - 收到错误 "Can' t 序列化用户”,但从未调用 Passport.serializeUser

javascript - 处理多个上传的文件 'synchroneously'

javascript - 很难理解 Promise.resolve() 和 promise 链之间的区别

javascript - $q 对 foreach 的 promise

javascript - 根据 HTML/JavaScript 中的单选按钮选择更改图像

json - Elasticsearch:如何动态存储所有json对象

node.js - Sails 应用最佳实践

javascript - 推荐每页只有一个文件 `.js`?

javascript - Jest 无法找到相对于目录的预设 "env"

javascript - 在对象类上实现 jquery 作用域的最佳方法?