2017-12-13 1 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 빈 지점을 찾은 후 종료, 재귀 방식으로 주문을 만든 다음에 함께 박았 :이 구현 할 수없는 것 같습니다 그러나

, 나는 같은 멤버 메소드가 있다고 가정 해 그러나 생

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

: this.orders

아래 목록은 이제하여이 함수를 호출 s 실패 :

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

왜 작동하지 않습니까? 나는 아직 무엇을 이해하지 못하고 있는가?


편집 : 대신 CreateThem가 완료 될 때까지 기다리는

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

그러나이 immediatelly 결의를 실행 : 나는 또한 새로운 약속에 의해 반환을 대체하기 위해 시도했습니다. 도 바로이 약속이나라는 이벤트를 기다리는 몇 가지 코드를했을 것이다 그 전에 return CreateThem.bind(this, counter, maxRequests);

+0

그 코드에서 약속을 만들거나 반환하는 것을 보지 마라. – WilomGfx

+0

@WilomGfx 나는 존재하지 않습니까?- 나는 sailjs에 관한 문서의 아래쪽 "예제"를 따라 가고있다 : https://sailsjs.com/documentation/reference/waterline-orm/models – paul23

+0

yes. 당신의'createNextBatch()'를 호출한다. 'createNextBatch()'에서 약속을 전혀 반환하지 않습니다. – WilomGfx

답변

0

당신은 resolve 약속 비동기 작업을 완료해야합니다 후. 예를 들어

: 어쩌면

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

: 그것은 else 블록에서 종료 있도록, 그것은 다시 r 미만 0 때까지 데이터베이스에서 항목을 찾을 수 r >= 0 경우

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

, 코드를 변경할 수 있습니다.

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() 기능, 당신이해야 : initialLoader.CreateNextBatch()()

기능 CreateThem는 true를 반환 할 수있는 경우에 this.maxNum> = 0, 참 또는 거짓이 재귀에 따라의 약속. 그러나 allways 보장 약속을 반환 보장하지 않습니다. () => {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);}; 
} 
관련 문제