2017-12-12 14 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パターンは、その値が1回だけ解決されます。

すべての距離を収集する必要がある場合は、完了した時点を知るためのしきい値を設定するか、完了したことを示すonCompleted()コールバックがあるかどうかを判断する必要があります。

アイテムが届くたびに最も近いライダーを更新するには、サブスクリプション内でそれを計算するだけで済みます。

関連する問題