2017-12-13 13 views
1

私は、約束を返さなければならないことを理解しており、約束を守るという約束の結果ではないことを理解しています。新しい約束を作成するには?

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空のスポットを発見した後終了し、再帰的な方法で注文を作成し、中にそれらを一緒に置く:私はこれを実装することができないように見えるしかし

は、私のようなメンバメソッドを持っていると言いますしかしTHI

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

this.orders

下のリストは、今、私がすることで、この関数を呼び出しましたは失敗する:

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

なぜこれが機能しないのですか?私はまだ何を理解していないのですか?


編集:私はまた、新しい約束によってリターンを交換しようとしました:

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

しかし、これはimmediatelly決意を実行し、代わりのCreateThemが完了するのを待っています。 NOR直接お約束かと言うイベントを待っているいくつかのコードを持っているだろうその前にreturn CreateThem.bind(this, counter, maxRequests);

+0

iあなたはそのコードの中で約束を作成したり返すことはありません。 – WilomGfx

+0

@WilomGfx私はいませんか? - 私はsailjsに関するドキュメントの一番下の "例"に従っています:https://sailsjs.com/documentation/reference/waterline-orm/models – paul23

+0

はい、あなたの '.NextBatch()'を呼び出してください。 'createNextBatch()'から約束を返すことはありません。 – WilomGfx

答えて

0

非同期操作が行われた後、あなたが約束をresolve必要があります。例えば

:あなたのコードで

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

r >= 0場合、それはelseブロックで終了して、それは、r0未満まで再び、データベース内のエントリを検索します:たぶん

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);}; 
} 
0
return new Promise((resolve, reject) => { 
    globalVarKeep = resolve; 
    globalVarBreak = reject; 
    }); 

によって機能: -

CreateThem(counter, maxRequests); 
    globalVarKeep(); 

または

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

それが適切なら。

0

関数を返すinitialLoader.CreateNextBatch()機能、ない約束、あなたが実行する必要があります。this.maxNum> = 0と再帰に応じて、真または偽の約束場合initialLoader.CreateNextBatch()()

機能CreateThemはtrueを返すことができます。しかし、必ずしも保証されているわけではありません。 () => {CreateThem(counter, maxNum);};は何も返しません。あなたは次のことを試みることができる:

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);}; 
} 
関連する問題