【问题标题】:return array from promise [duplicate]从承诺返回数组[重复]
【发布时间】:2021-02-08 21:16:28
【问题描述】:

我正在尝试使用 Node.js/Javascript 从承诺中返回一个数组。

'server.js' 文件:

const db = require('./routes/queries');

 function _seedings() {

 db.seedlings("hockey")
 .then(function(value) {
 console.log('I returned this from seedlings: ' + value)
 })
 .catch(function(err) {
 console.log('Caught an error in _seedings!', err);
 });

 return;

 }

'queries.js' 文件:

 function seedlings(_cat) {
  return new Promise(function(resolve, reject) {

  var _seeds = [];
  var _directory = './galleries/pix/' + _cat;

   fs.readdir(_directory, (err, files) => { 
     if (err) {
       console.log(err); 
     } else { 
       files.forEach(file => {
         if (path.extname(file) == ".jpg" || path.extname(file) == ".jpeg") {
         _str = file.toString()
         _seeds.push(_str); 
         }  //extension is .jpg OR .jpeg
       })  //forEach
     }  //if/else 
   })  //fs.readdir

  resolve(_seeds);

  });  //new promise 
 }

我已经使用与此类似的代码来查询数据库并在“解析”中返回结果。但是,使用此代码,我无法返回“_seeds”数组。似乎正在为其中的每个文件读取目录,但从那时起,要么没有填充数组,要么没有正确返回。非常感谢任何建议。

【问题讨论】:

  • readdir 本身是异步的。您需要在其回调中resolve

标签: javascript arrays promise


【解决方案1】:

一旦所有文件都被迭代,您需要使用所需数据解决承诺,即_seeds 数组。由于您是从 readdir 的回调函数外部调用 resolve,因此在 readdir 完成之前,promise 会被解析。

将 queries.js 更改为以下应该可以工作:

function seedlings(_cat) {
  return new Promise(function(resolve, reject) {

  var _seeds = [];
  var _directory = './galleries/pix/' + _cat;

   fs.readdir(_directory, (err, files) => { 
     if (err) {
       console.log(err); 
       reject(err);
     } else { 
       files.forEach(file => {
         if (path.extname(file) == ".jpg" || path.extname(file) == ".jpeg") {
           _str = file.toString()
           _seeds.push(_str); 
         }  //extension is .jpg OR .jpeg
       })  //forEach
       
       // Resolve after all files are iterated and _seeds is populated.
       resolve(_seeds);
     }  //if/else 
   })  //fs.readdir

  }) // Promise
}

【讨论】:

  • 感谢您提供的信息。我进行了调整,现在数组似乎正在返回填充的信息。非常感激!问候。
猜你喜欢
  • 2020-08-26
  • 1970-01-01
  • 2021-07-22
  • 2021-04-18
  • 2015-11-04
  • 2016-10-20
  • 2018-06-03
  • 2015-02-13
相关资源
最近更新 更多