节点针同步等待承诺不起作用 [英] Node needle synchronous await promise not working

查看:96
本文介绍了节点针同步等待承诺不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我不知道这么简单的事情在nodejs和javascript中不起作用.我不知道该如何解决.我想等待从外部获取电影列表并解析它,然后再返回数据.这是我第一次使用快递或针头.但是我认为尝试返回所有数据之前,这太复杂了.请问什么是最好的等待时间.

I do not know how something so simple does not work in nodejs, and javascript. I don't know how to resolve this. I want to wait to get the list of movies from external and parse it before returning the data. This is my first time using express or needle. But I think its too complex trying to wait for all the data before returning. what is the best wait out, please.

  App.get("/users", async (request, response) => {
  //console.log("movieDB");
  //database call works fine
  let userlist = await moviedb.getUsers();
  //console.log(userlist);


  let userMovieList = await getMovieUserObj(userlist);


  // Promise.resolve(userMovieList);
  console.log(userMovieList[0]);

  //console.log(userlist);
  response.send("see console" + userMovieList);
  response.end();
});

function getMovieUserObj(userlist) {
  return userlist.map(async (user) => {

    let movieInfoObj = getMovieData(user.favourite_movies);
    console.log(movieInfoObj);
    return {
      id: user.id,
      name: user.firstName + " " + user.lastName,
      favourite_movies: movieInfoObj,
    };
  }
  );
}


async function getMovieData(favourite_movies) {
  var favMovies = [];
  var movieArray = favourite_movies.split(",");
  var itemsProcessed = 0;

  return movieArray.map(async function (movieID) {

    param.i = movieID;

    return needle("get", omdbURL, param, { json: false })
      .then(function (res) {
        //return res.body;
        let movieDetail = res.body;
        let tempObj = {
          ID: movieDetail.imdbID,
          Title: movieDetail.Title,
          Year: movieDetail.Year,
          Plot: movieDetail.Plot,
          Poster: movieDetail.Poster,
        };
        console.log("short details of movie" + tempObj.ID);
        //console.log(tempObj);
        return tempObj;
      })
      .catch(function (err) {
        console.log("Error " + err);
        return [];
      });

    return movieOb;
  });
}


从控制台输出.


output from console.

sqlite不支持插入默认值.设置 useNullAsDefault 标志以隐藏此警告.(请参阅文档

sqlite does not support inserting default values. Set the useNullAsDefault flag to hide this warning. (see docs

Listening to port :8080   Promise {   [
    Promise { <pending> },
    Promise { <pending> },
    Promise { <pending> },
    Promise { <pending> }   ] } Promise {   [
    Promise { <pending> },
    Promise { <pending> },
    Promise { <pending> }   ] } Promise {   [
    Promise { <pending> },
    Promise { <pending> },
    Promise { <pending> },
    Promise { <pending> },
    Promise { <pending> }   ] } Promise { [ Promise { <pending> }, Promise { <pending> } ] } Promise { [ Promise { <pending> } ] } Promise {   { id: 1, name: 'Anona Cruz', favourite_movies: Promise { [Array] } } } short details of moviett0848228 short details of moviett4154796 short details of moviett0120575 short details of moviett4154756 short details of moviett4154756 short details of moviett4116284 short details of moviett10515848 short details of moviett0103776 short details of moviett2313197 short details of moviett0389860 short details of moviett0287871 short details of moviett0417741 short details of moviett2975590 short details of moviett0926084 short details of moviett2395427

express函数返回一个诺言对象,我希望事情按顺序发生.

The express function is returning a promise object I want the things to happen in sequence.

推荐答案

我认为我使用

return Promise.all(userlist.map(async (users. 

return Promise.all(movieArray.map(async function (movieID) {

这篇关于节点针同步等待承诺不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆