2017-12-02 8 views
1

アイテムIDを表す文字列の配列を指定すると、文字列を繰り返し処理し、データベースからアイテムオブジェクトを取り出し、配列にアイテムオブジェクトを追加し、私のデータベースからのコールバックの範囲外にある。コールバック関数のスコープの外にある配列に値を設定する

function getItemObjects(items, callback) { 
    let returnItems = []; 
    items.forEach((i) => { 
    Item.getItemById(i, (err, item) => { 
     if (err) { 
     console.log(err); 
     return; 
     } else { 
     returnItems.push(item); 
     } 
    }); 
    }); 
    callback(returnItems); 
} 

Item.getItemById()は、アイテムモデル内でmongoデータベースからオブジェクトを取得する関数です。どのようにして、そのコールバック関数の範囲外の配列に値を設定できますか?

getItemObjects()関数からコールバック値を取得したときの値は、[]です。しかし、私はそれの値をforループの中に記録すると、それは適切に設定されます。

+1

の詳細を見つけることができます; '実行されますか? –

+0

空の配列を返します。私がItem.getItemById()コールバック関数の範囲外で参照するときはいつでも空です。その関数を終了するとリセットされるようです。 – Darren

+1

約束を使用することはアイデアのように思えます。この質問は、https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-callの欺瞞だと思います – mplungjan

答えて

1

約束を使用して、データベースコールバックから値を抽出することができます。

はこれを試してみてください。

function getItemObjects(items, callback) { 
 
    const itemPromises = items.map((itemId) => { 
 
    return new Promise((resolve, reject) => { 
 
     Item.getItemById(itemId, (err, item) => { 
 
     if (err) { 
 
      reject(err); 
 
     } 
 
     resolve(item); 
 
     }); 
 
    }); 
 
    }); 
 

 
    Promise.all(itemPromises) 
 
    .then(results => callback(results)) 
 
    .catch(error => callback(error)); 
 

 
}

ご注意をここでは、エラー、(Promise.allから)全体の約束内の項目の結果のいずれかがcatchブロックが失敗とするかどうか実行されます。

あなたは、あなただけのコールバック(returnItems) `前returnItems``に何を得るのですかPromise.allPromise.catch

+0

ありがとうあなた、素晴らしい作品です。 .thenの下にあるコールバックの引数として項目を追加しなければならなかったが、その後は正しく機能する。 – Darren

+0

指摘していただきありがとうございます。あなたのコメントでコードを更新しました。 – marceloemanoel