亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

NodeJS:等待所有帶有 Promise 的 foreach 完成但從未真正完成

NodeJS:等待所有帶有 Promise 的 foreach 完成但從未真正完成

皈依舞 2021-06-29 13:39:33
我正在使用 Nodejs。我有一個異步的 forEach,因為我必須在 forEach 中等待結果。因此,我需要等待 forEach 完成,然后繼續處理循環的結果。我找到了幾種等待 forEach 的解決方案,其中之一是使用 Promises。我做到了,并且創建了這些承諾,但是,forEach(以及承諾)完成后的代碼從未真正執行(console.log 未打印)。并且 NodeJS 函數剛剛結束,沒有任何錯誤。這是我的代碼:var Client = require('ssh2').Client;// eslint-disable-next-line no-undefvar csv = require("csvtojson");// eslint-disable-next-line no-undefvar fs = require("fs");// eslint-disable-next-line no-undefconst config = require('./config.json');// eslint-disable-next-line no-undefconst os = require('os');let headerRow = [];let sumTxAmount = 0;const filenameShortened = 'testFile';let csvLists = [];let csvFile;const options = {    flags: 'r',    encoding: 'utf8',    handle: null,    mode: 0o664,    autoClose: true}var conn = new Client();async function start() {    const list = await getCSVList();    let content = fs.readFileSync('./temp.json', 'utf8');    content = JSON.parse(content);    var promises = list.map(function(entry) {        return new Promise(async function (resolve, reject) {            if (!content['usedFiles'].includes(entry.filename)) {                const filename = entry.filename;                csvFile = await getCsv(filename);                csvLists.push(csvFile);                console.log('here');                resolve();            } else {                resolve();            }        })    });    console.log(promises)    Promise.all(promises)        .then(function() {            console.log(csvLists.length, 'length');        })        .catch(console.error);}start();"here" 打印一次(不是數組長度為 8 的 8 次),但是創建了 8 個 promise。不執行我打印數組長度的下部。誰能告訴我我做錯了什么?我是否錯誤地使用了 Promises 和 forEach,因為我必須在 forEach 中等待?
查看完整描述

2 回答

?
哈士奇WWW

TA貢獻1799條經驗 獲得超6個贊

Promise.all 是一個將返回一個promise 對象的方法,但您不是在等待您的start 方法執行。


function getCSVList() {

  return new Promise((resolve, reject) => {

    setTimeout(() => {

      resolve([1, 2, 3, 4]);

    }, 1000);

  });

}


function getCsv(params) {

  return new Promise((resolve, reject) => {

    setTimeout(() => {

      resolve(params);

    }, 1000);

  });

}


async function start() {

  const list = await getCSVList();

  const promises = list.map(item => {

    return new Promise(async function (resolve, reject) {

      const csvFile = await getCsv(item);

      console.log('here');

      resolve(csvFile);

    });

  });


  return Promise.all(promises);

}


start().then(res => {

  console.log(res);

});


查看完整回答
反對 回復 2021-07-08
  • 2 回答
  • 0 關注
  • 513 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號