2017-10-16 5 views
0

私の簡素化のコードでは:Reactjs - メソッドは、API呼び出しがデータを取得する前に結果を返します。 (常に空のオブジェクト)

static getData(Id) { 
    const data = []; 
    api.getData(lId) 
    .then((Res) => { 
     data.push(Res); 
    }); 
    return data; 
} 

APIエンドポイントは、データを取得しますが、それはいくつかの時間がかかります。メソッドは常に[]を返しますが、console.log(Res)を置くとデータはそこにあります。メソッドが最初のconst data = [];を返し、APIがデータを返すまで待機しないことを意味します。

この問題を解決するにはどうすればよいですか?

Regrds

+0

約束を正しく使うことによって。 'getData'は約束を返さなければなりません。重複を参照してください。 –

答えて

1

あなたのタイミングの問題はここにあります:

static getData(Id) { 
    const data = []; 
    api.getData(lId) 
    .then((Res) => { 
     data.push(Res); 
    }); 
    return data; <-- Gets returned before the promise resolves/rejects 
} 

あなたは余分な処理を行う必要がある場合あなたのデータを呼び出し元に返す前に - あなたの例では、配列に入れています - あなたは別の約束でそれを包む必要があります:

static getData(Id) { 
    return new Promise((resolve, reject) => { 
     api 
     .getData(Id) 
     .then((Res) => { 
      const data = [] 
      data.push(Res); 
      resolve(data) 
     }) 
     .catch(reject) 
    }) 
} 
1

あなたはPromiseを使用する必要があります。

例えば:

static getData(Id) { 
    return new Promise((resolve) => { 
    api.getData(Id) 
     .then((Res) => { 
     resolve(Res); 
     }); 
    }); 
} 

そして、このように、このメソッドを使用します。

getData(15) 
    .then((data) => { 
    console.log(data); 
    }); 
+0

プロミスを使用しましたが、apiは約束です。 – Adel

+0

はい、apiは非同期呼び出しを行うため、別の約束をする必要があります。 –

関連する問題