2017-11-03 15 views
0

私は約束を実装することができます。この機能を実行すると、配列の中に何かがありますか?。約束を正しく実装する方法

結果を関数にconsole.logできますが、結果が正しく返されると思いますが、res.jsonの結果には空の配列が表示されます。私はそれが関数が終了するよりも速く読み込むためだと仮定します。

const {grabArticles} = require('../controller/update.js'); 
 

 
// variables 
 
const router = express.Router(); 
 

 

 
router.get('/new', (err, res) => { 
 
    const results = []; 
 
    const test = grabArticles(results) 
 
    test.then((results) => { 
 
    res.json(results); 
 
    }) 
 
});

//different file 
 
const request = require('request'); 
 
const cheerio = require('cheerio'); 
 

 
grabArticles = (results) => { 
 
    // const results = []; 
 
    request("https://fivethirtyeight.com/", function(error, response, html) { 
 
    const $ = cheerio.load(html); 
 
    for (x=1; x<4; x++) { 
 
     // i is the current loop number, element=this is the current data requested 
 
     $('#home-feature-' + x.toString()).each((i, element) => { 
 
     const topic = $(element).children('.post-info').children('.topic').text().trim(); 
 
     const title = $(element).children('.post-info').children('.tease-meta').children('.tease-meta-content').children('h2.article-title.entry-title').text().trim(); 
 
     // console.log('topic: ' + topic + '\n' + 'title: ' + title); 
 
     const newArticle = { 
 
      topic: topic, 
 
      title: title 
 
     }; 
 
     results.push(newArticle); 
 
     }) 
 
    } 
 
    console.log('inside update.js' + results); 
 
    }); 
 
    return results; 
 
}

+1

grabArticles'は 'Promise'はなく、私の後に配列 –

+0

繰り返しは「約束は非同期コードを同期しないでください」返す必要がありますあなたが' ...(Ͼ˳Ͽ) –

答えて

1

その後、resultsを解決Promiseを、返却する必要があります。 resultsの値は、最初のパラメータとしてコールバックに渡されます。

テストされていないが、それはこのようになります。

//different file 
 
const request = require('request'); 
 
const cheerio = require('cheerio'); 
 

 
grabArticles = (results) => { 
 
    // const results = []; 
 
    return new Promise(function(resolve) { 
 
    request("https://fivethirtyeight.com/", function(error, response, html) { 
 
     const $ = cheerio.load(html); 
 
     for (x = 1; x < 4; x++) { 
 
     // i is the current loop number, element=this is the current data requested 
 
     $('#home-feature-' + x.toString()).each((i, element) => { 
 
      const topic = $(element).children('.post-info').children('.topic').text().trim(); 
 
      const title = $(element).children('.post-info').children('.tease-meta').children('.tease-meta-content').children('h2.article-title.entry-title').text().trim(); 
 
      // console.log('topic: ' + topic + '\n' + 'title: ' + title); 
 
      const newArticle = { 
 
      topic: topic, 
 
      title: title 
 
      }; 
 
      results.push(newArticle); 
 
     }) 
 
     } 
 
     console.log('inside update.js' + results); 
 
     
 
     ////////////////////////// 
 
     /// Resolve the promise here 
 
     /// the then() will get triggered 
 
     ////////////////////////// 
 
     resolve(results); 
 
    }); 
 
    }); 
 
}

非常に単純化されたバージョンは、次のようになります。

// This function returns a Promise 
function doSomethingAysnc(){ 
    return new Promise(function(resolve){ 
     request('/my/url', function(data){ 
      // When we are staisfied with ending the promise 
      // We resolve it so the calling function can then 
      // handle the rest 
      return resolve(data); 
     }); 
    }); 
} 

// Here we will call our async function 
// Once the promise resolves 
// We get our data back for further usage 
doSomethingAysnc().then(function(data){ 
    // We can the access the data here 
    console.log(data); 
}); 
+0

ベターこれらすべての 'チェリオを置きます'例外処理が行われる' then'コールバックで処理し、 'new'プロンプトで' request'呼び出し自体をラップします – Bergi

0

はこのように約束を使用してgrabArticlesを書き換えます。

grabArticles = (results) => { 
    return new Promise((resolve, reject) => { 
    request("https://fivethirtyeight.com/", function(error, response, html) { 
     const $ = cheerio.load(html); 
     for (x=1; x<4; x++) { 
     // i is the current loop number, element=this is the current data requested 
     $('#home-feature-' + x.toString()).each((i, element) => { 
      const topic = $(element).children('.post-info').children('.topic').text().trim(); 
      const title = $(element).children('.post-info').children('.tease-meta').children('.tease-meta-content').children('h2.article-title.entry-title').text().trim(); 
      // console.log('topic: ' + topic + '\n' + 'title: ' + title); 
      const newArticle = { 
      topic: topic, 
      title: title 
      }; 
      results.push(newArticle); 
     }) 
     } 
     console.log('inside update.js' + results); 
     // return result using resolve, otherwise using reject(error) to reflect something wrong 
     resolve(results); 
    }); 
    }); 
} 
関連する問題