gpt4 book ai didi

javascript - 如何按顺序正确调用异步函数列表?

转载 作者:行者123 更新时间:2023-11-28 18:56:29 25 4
gpt4 key购买 nike

我正在尝试在 Node.js 中编写一个类似“robocopy/mir”的函数,但似乎无法理解如何按顺序正确执行多个异步函数。

一些背景:

  • 该脚本在 Windows 上运行,因此,我需要找到某种方法来复制文件,同时保留修改时间并接收进度通知。
  • 为了解决这个问题,我继续在 .NET 中编写了复制函数(使用 Edge.js 调用它)——这个复制函数只是回调报告文件复制进度的 Node 函数。这件作品完美无瑕。

为了按顺序复制文件,我的第一个想法是执行如下操作:

Object.keys(filesToCopy).forEach(function(key) {
var deferred = q.defer();
var payload = {
sourcePath: key,
destPath: filesToCopy[key],
progressCallback: progressCallback
};

console.log('Copying %s...', sourcePath);
// Edge.js called here
copyFile(payload, deferred.makeNodeResolver());

deferred.promise.then(function(result) {
console.log('%s complete.', result);
}, function(err) {
console.error('Error: ', err.message);
});

promises.push(deferred.promise);
});

不幸的是,这(如预期)在调用 .NET 函数后立即开始复制每个文件,因此,我会立即收到所有文件的进度通知,并给出如下输出:

1%
2%
1%
2%
3%
3%

似乎我需要一种方法来将要完成的工作排队,然后再一次全部完成,每个项目在下一个项目开始之前完成。当所有项目完成后,我需要收到通知。该解决方案看起来很简单,但仍然让我困惑,因为我尝试的每个 Angular 都会遇到另一个问题。任何帮助将不胜感激,谢谢!

编辑:正如我的评论中所述,Bergi 提供的答案是利用一个函数,该函数实际上确实返回了一个 promise ,而我的 Edge.js 函数则没有。我首先能够通过使用数组而不是 filesToCopy 的对象来解决我的问题。 ,然后做这样的事情:

  return filesToCopy.reduce(function(prev, curr) {
return prev.then(function() {
var deferred = q.defer();
copyFile(curr, function(err, result) {
deferred.resolve(result);
console.log('Completed %s', result);
});
return deferred.promise;
})
}, q());

这可能不是最好的方法,但它适合我的使用。

最佳答案

也许类似的东西可以解决问题:

var $j = function(val, space) {
return JSON.stringify(val, null, space || '')
}
var log = function(val) {
document.body.insertAdjacentHTML('beforeend', '<div><pre>' + val + '</div></pre>')
}



var files = '12345'.split('').map(function(v) {
return {
name: 'file_' + v + '.js',
load: function() {
var cur = this;
var pro = new Promise(function(resolve, reject) {

log('loading : ' + cur.name);

// we simualate the loading stuff
setTimeout(function() {
resolve(cur.name);
}, 1 * 1000);

}).then( function( val ) {

// once loaded
log('loaded : ' + val);
return val;

});

return pro;

}
};
});


files.reduce(function(t, v) {

t.promise = t.promise.then(function(){
return v.load();
});

return t;
}, {
promise: Promise.resolve(1)
});

关于javascript - 如何按顺序正确调用异步函数列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33549460/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com