Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript循环与附加参数同步_Javascript_Node.js_Promise - Fatal编程技术网

Javascript循环与附加参数同步

Javascript循环与附加参数同步,javascript,node.js,promise,Javascript,Node.js,Promise,我有一系列的承诺,我试图一个接一个地履行 function asyncInsertMagFromFile(file, resolve) { //some asynchronous processing with file resolve(); } let magRequests = fs.readdirSync(storeDir).map(function(file) { return new Prom

我有一系列的承诺,我试图一个接一个地履行

function asyncInsertMagFromFile(file, resolve) {
            //some asynchronous processing with file
            resolve();
          }

let magRequests = fs.readdirSync(storeDir).map(function(file) {
            return new Promise(resolve => {
              asyncInsertMagFromFile(file, resolve);
            });
          });
我试图“同步”处理这些承诺(请求),但没有成功。关于这个问题存在很多问题,但我还没有找到一个适合我的问题。我在这里尝试了一些trincot解决方案,但我不知道如何处理我的文件参数

例如,这不起作用(等待仅在异步函数中有效)


你知道我如何解决这个问题吗?

你可以尝试使用array.reduce来获取以前的值(承诺列表),并等待它完成后再调用asyncInserMagFromFile函数

(function loop() {
  fs.readdirSync(storeDir).reduce(async (previousPromise, file) => {
    await previousPromise;
    return new Promise(resolve =>
      asyncInsertMagFromFile(file, resolve);
    );
  },Promise.resolve());
})();

您可以尝试使用array.reduce获取前一个值(承诺列表),并等待它完成后再调用asyncInserMagFromFile函数

(function loop() {
  fs.readdirSync(storeDir).reduce(async (previousPromise, file) => {
    await previousPromise;
    return new Promise(resolve =>
      asyncInsertMagFromFile(file, resolve);
    );
  },Promise.resolve());
})();
等待仅在异步函数中有效

(async function loop() {
            fs.readdirSync(storeDir).forEach(function(file) {
              await new Promise(resolve =>
                asyncInsertMagFromFile(file, resolve)
              );
            });

          })();
使用
.map
而不是
.forEach
,并将异步函数作为回调传递给它

等待仅在异步函数中有效

(async function loop() {
            fs.readdirSync(storeDir).forEach(function(file) {
              await new Promise(resolve =>
                asyncInsertMagFromFile(file, resolve)
              );
            });

          })();

使用
.map
而不是
.forEach
,并将一个异步函数作为回调传递给它。

您可以将一些“然后”一个接一个地链接起来

function asyncInsertMagFromFile(file) {
    return new Promise((resolve, reject) => {
        //some asynchronous processing with file
        // call resolve when finished
        resolve();
    })
}

let chain = Promise.resolve();

fs.readdirSync(storeDir).forEach(function (file) {
    chain = chain.then(((file) => () => asyncInsertMagFromFile(file))(file));
});

chain.then(() => {
    //finished
}).catch((err) => {
   //error in chain
})
另一种方法是使用评论中提到的for语句:

function asyncInsertMagFromFile(file) {
    return new Promise((resolve, reject) => {
        //some asynchronous processing with file
        // call resolve when finished
        resolve();
    })
}

(async () => {
    const files = fs.readdirSync(storeDir);

    for (let i = 0; i < files.length; i++) {
        await asyncInsertMagFromFile(files[i]);
    }
})()
函数asyncInsertMagFromFile(文件){
返回新承诺((解决、拒绝)=>{
//使用文件进行异步处理
//完成后调用resolve
解决();
})
}
(异步()=>{
const files=fs.readdirSync(storeDir);
for(设i=0;i
你可以把一些链接起来,然后一个接一个地链接起来

function asyncInsertMagFromFile(file) {
    return new Promise((resolve, reject) => {
        //some asynchronous processing with file
        // call resolve when finished
        resolve();
    })
}

let chain = Promise.resolve();

fs.readdirSync(storeDir).forEach(function (file) {
    chain = chain.then(((file) => () => asyncInsertMagFromFile(file))(file));
});

chain.then(() => {
    //finished
}).catch((err) => {
   //error in chain
})
另一种方法是使用评论中提到的for语句:

function asyncInsertMagFromFile(file) {
    return new Promise((resolve, reject) => {
        //some asynchronous processing with file
        // call resolve when finished
        resolve();
    })
}

(async () => {
    const files = fs.readdirSync(storeDir);

    for (let i = 0; i < files.length; i++) {
        await asyncInsertMagFromFile(files[i]);
    }
})()
函数asyncInsertMagFromFile(文件){
返回新承诺((解决、拒绝)=>{
//使用文件进行异步处理
//完成后调用resolve
解决();
})
}
(异步()=>{
const files=fs.readdirSync(storeDir);
for(设i=0;i
这可能对您有所帮助

异步函数asyncInsertMagFromFile(文件){ //使用wait收集处理结果或返回承诺 返回结果; } 函数映射请求(storeDir){ 返回fs.readdirSync(storeDir).map(异步函数(文件){ 返回等待asyncInsertMagFromFile(文件); }); } 映射请求(storeDir).then((映射)=>{});
示例不起作用的原因是
forEach
处理程序函数使用
await
,但未声明为异步。

这可能会对您有所帮助

异步函数asyncInsertMagFromFile(文件){ //使用wait收集处理结果或返回承诺 返回结果; } 函数映射请求(storeDir){ 返回fs.readdirSync(storeDir).map(异步函数(文件){ 返回等待asyncInsertMagFromFile(文件); }); } 映射请求(storeDir).then((映射)=>{});
您的示例不起作用的原因是,
forEach
处理程序函数使用了
await
,但未声明为异步。

如果要串联处理并处理结果,则可以使用递归:

const FAILED = {};
const processImages = (files) => {
  const recur=(files,result) => {
    if(files.length===0){
      return result;
    }
    return asyncInsertMagFromFile(files[0])
    .catch(error=>FAILED)//always resolve, place FAILED values when rejected
    .then(success=>recur(files.slice(1),result.concat(success)))
  }
  return recur(files,[])
}

processImages(fs.readdirSync(storeDir)).then(results=>{
  console.log('failed',results.filter(r=>r===FAILED).length)
});
对于并行处理,您可以使用Promise.all:

Promise.all(
  fs.readdirSync(storeDir).map((file)=> asyncInsertMagFromFile(file).catch(FAILED))
).then(results=>{
  console.log('failed',results.filter(r=>r===FAILED).length)
})

如果要串联处理并处理结果,则可以使用递归:

const FAILED = {};
const processImages = (files) => {
  const recur=(files,result) => {
    if(files.length===0){
      return result;
    }
    return asyncInsertMagFromFile(files[0])
    .catch(error=>FAILED)//always resolve, place FAILED values when rejected
    .then(success=>recur(files.slice(1),result.concat(success)))
  }
  return recur(files,[])
}

processImages(fs.readdirSync(storeDir)).then(results=>{
  console.log('failed',results.filter(r=>r===FAILED).length)
});
对于并行处理,您可以使用Promise.all:

Promise.all(
  fs.readdirSync(storeDir).map((file)=> asyncInsertMagFromFile(file).catch(FAILED))
).then(results=>{
  console.log('failed',results.filter(r=>r===FAILED).length)
})

IIRC数组函数不能很好地实现承诺(即它们不等待解决)。另一方面,正常的控制流操作(
for
for…of
while
,等等)应该会给您带来更大的成功。IIRC数组函数不能很好地实现承诺,即它们不会等待解决。另一方面,正常的控制流操作(
for
for…of
while
,等等)应该会给您带来更大的成功。我喜欢reduce思想与链接承诺相结合:
fs.readdirSync(storeDir).reduce((previousPromise,file)=>{return previousPromise(resolve=>asyncInsertMagFromFile(file,resolve))(file));},Promise.resolve();
我喜欢reduce思想与链接承诺相结合:
fs.readdirSync(storeDir).reduce((previousPromise,file)=>{return previousPromise.then((file)=>()=>newpromise(resolve=>asyncInsertMagFromFile(file,resolve))(file));},Promise.resolve());
谢谢大家,在测试之后,所有这些答案都很有效,但这就是我使用的答案。请随时告诉我其他答案是否应该是“正确的”(即使有很多方法可以做同样的事情)。谢谢大家,在测试完之后,所有这些答案都很有效,但这就是我使用的答案。请随时告诉我其他答案是否应该是“正确”的答案(即使有很多方法可以做同样的事情)。