簡體   English   中英

NodeJS返回的數據有時會更改

[英]NodeJS returned data sometimes changes

我是NodeJS的新手,但有一個我不明白的問題。

在此函數中,我一個接一個地調用幾個API,以檢索有關電影的一些數據。 結果並不總是相同的。 大多數情況下,結果是正確的,但有時結果不完整。

我嘗試使用then嘗試鏈接API調用,但似乎不起作用。

知道為什么結果並不總是相同的嗎? 任何幫助,將不勝感激。

// test fetchData(456165)

function fetchData(filmid) {

let average = array => array.reduce((a, b) => a + b) / array.length
var notes = []

mdb.movieInfo({
    id: filmid,
    language: 'fr'
  },
  (err, resOmdb) => {
    notes.push(parseFloat(resOmdb.vote_average))
    imdb
      .getById(resOmdb.imdb_id, {
        apiKey: 'e9d59b68',
        timeout: 3000
      })
      .then(
        allocine.api(
          'search', {
            q: `${resOmdb.title}`,
            filter: 'movie'
          },
          function(error, resAllo) {
            if (error) {
              return
            }

            allocine.api(
              'movie', {
                code: `${resAllo.feed.movie[0].code}`
              },
              function(error, result) {
                if (error) {
                  return
                }
                notes.push(parseFloat(result.movie.statistics.userRating) * 2)
              }
            )

            // doesn't seem to execute all the time
            allocine.api(
              'showtimelist', {
                zip: 44260,
                movie: resAllo.feed.movie[0].code
              },
              function(error, resultCin) {
                if (error) {
                  return
                }

                // sometimes doesn't appear in the result
                resOmdb.cinemas = resultCin
              }
            )

          }
        )
      )
      .then(
        function(result) {
          notes.push(parseFloat(result.rating))
          resOmdb.vote_average = average(notes).toFixed(2)

          // check the result
          console.log(util.inspect(resOmdb, false, null))
        },
        function(error) {
          return
        }
      )
  }
)
}

首先,您應該決定是否要使用Promises。 如果這樣做,則使所有功能合理化。 接下來需要做的就是“兌現”您的諾言(如果在函數內部使用它們)。

在您的情況下,可能不會返回您的第一個imbd api調用。

接下來,您應該檢查您的節點版本是否支持異步等待。

然后,您可以輕松進行api調用,而不會分心。

'use strict';

const Promise = require('bluebird');
const mdb = Promise.promisfyAll(require('mdb'));
const allocine = Promise.pomisifyAll(require('allocine-api'));

// test fetchData(456165)

async function fetchDate(filmId) {
  const notes = [];
  const resOmdb = await mdb.movieInfoAsync({ id: filmId });
  notes.push(parseFloat(resOmdb.vote_average));

  const imdbResult = await imdb.getByIdAsync(resOmdb.imdb_id, { apiKey: 'e9d59b68', timeout: 3000 });

  const resAllo = await allocine.apiAsync('search', { q: `${resOmdb.title}`, filter: 'movie' });
  // and so on ...
}

更新:為了加快您的功能,您可以同時執行請求。 為此,請使用Promise.join

  const [imdbResult, allocineResult] = await Promise.join(
    imdb.getByIdAsync(resOmdb.imdb_id, { apiKey: 'e9d59b68', timeout: 3000 }),
    allocine.apiAsync('search', { q: `${resOmdb.title}`, filter: 'movie' });
  );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM