2017-12-12 9 views
0

약속 값은 console.log이지만 값은 반환되지만 길이는 0을 반환합니다. 값을 경고하면 약속은 반환되지만 비어 있습니다.약속 값 길이는 0을 반환합니다.

this.findClosestRiderToUser().then(data => { 
    console.log(data); 
    //alert (data) not working , returns empty 
    //console.log(data.length) returns 0 
}) 

//here is the promise code 
findClosestRiderToUser(){ 
    var promise = new Promise((resolve, reject)=> { 
     this.fetchAllRiders().subscribe(distance => { 
      this.distances.push(distance); 
     }); 

     resolve(this.distances); 
    }) 

    return promise; 
} 

내가 잘못하고있는 것이 있습니까?

답변

2

바로 Promise을 해결하고 있습니다. 나는 fetchAllRiders()도 비동기식이라고 가정하고 있습니다. 구독하고 있기 때문에 곧바로 해결하면 아무 것도 남기지 않을 것입니다.

당신은 내부 resolve()에 필요 해요 당신의 구독 : 그것은 단지 하나 개의 거리를 반환하는 경우

this.findClosestRiderToUser().then(data => { 
    console.log(data); 
});  

findClosestRiderToUser() { 
    return new Promise((resolve, reject)=> { 
    this.fetchAllRiders().subscribe(distance => { 
     this.distances.push(distance); 
     resolve(this.distances); 
    }); 
    }); 
} 

그러나, 그것은 단지 다시 거리에 줄 것이다.

구독 패턴을 약속 패턴으로 감싸는 것처럼 보이는데 근본적으로 다르므로 실제로 작동하지 않습니다.

구독 패턴에는 일반적으로 연속적인 데이터 피드가 있습니다. 너 을 구독하므로 업데이트가있을 때마다 알려줄 수 있습니다.

Promise 패턴은 완료 될 때 한 번만 값을 결정합니다.

모든 거리를 수집해야하는 경우 완료 시점을 알 수있는 임계 값이 있거나 완료되었음을 알리는 일종의 onCompleted() 콜백이 있어야합니다.

가장 가까운 라이더를 아이템이 나올 때마다 업데이트하고 싶다면 구독 내에서 그 라이더를 업데이트하면됩니다.