Javascript 承诺可以用来触发一系列异步加载吗?

Javascript 承诺可以用来触发一系列异步加载吗?,javascript,node.js,promise,q,Javascript,Node.js,Promise,Q,我在寻找承诺的用途方面遇到了问题,我也承认我对承诺的理解是非常基本的。据我所知,它们似乎只是在模仿同步行为 是否可以使用承诺并保持异步行为,然后在它们全部完成后使用then() 像这样 var fileRegister = [ 'fileA', 'fileB', 'fileC' ]; for( i in fileRegister ) { asyncLoadFile( fileRegister[ i ], function( err, data ) { delete fileRegi

我在寻找承诺的用途方面遇到了问题,我也承认我对承诺的理解是非常基本的。据我所知,它们似乎只是在模仿同步行为

是否可以使用承诺并保持异步行为,然后在它们全部完成后使用then()

像这样

var fileRegister = [ 'fileA', 'fileB', 'fileC' ];

for( i in fileRegister ) {
  asyncLoadFile( fileRegister[ i ], function( err, data ) {
    delete fileRegister[ i ];
    if ( ! fileRegister.length ) {
      console.log('done');
    }
  });
}

我真的很惊讶网站上似乎没有权威的答案。是的,您可以创建一组承诺(每个承诺包装一个异步操作),然后调用承诺,一旦所有承诺都执行了,所有承诺都将得到解决:

var p1 = new Promise(function(resolve, reject) { 
  setTimeout(resolve, 1000, "one"); 
}); 
var p2 = new Promise(function(resolve, reject) { 
  setTimeout(resolve, 2000, "two"); 
});
var p3 = new Promise(function(resolve, reject) {
  setTimeout(resolve, 3000, "three");
});
var p4 = new Promise(function(resolve, reject) {
  setTimeout(resolve, 4000, "four");
});
var p5 = new Promise(function(resolve, reject) {
  reject("reject");
});

Promise.all([p1, p2, p3, p4, p5]).then(function(value) { 
  console.log(value);
}, function(reason) {
  console.log(reason)
});

这是E^规范的一部分,大多数实现都支持它。

我真的很惊讶,网站上似乎没有权威的答案。是的,您可以创建一组承诺(每个承诺包装一个异步操作),然后调用承诺,一旦所有承诺都执行了,所有承诺都将得到解决:

var p1 = new Promise(function(resolve, reject) { 
  setTimeout(resolve, 1000, "one"); 
}); 
var p2 = new Promise(function(resolve, reject) { 
  setTimeout(resolve, 2000, "two"); 
});
var p3 = new Promise(function(resolve, reject) {
  setTimeout(resolve, 3000, "three");
});
var p4 = new Promise(function(resolve, reject) {
  setTimeout(resolve, 4000, "four");
});
var p5 = new Promise(function(resolve, reject) {
  reject("reject");
});

Promise.all([p1, p2, p3, p4, p5]).then(function(value) { 
  console.log(value);
}, function(reason) {
  console.log(reason)
});

这是E^规范的一部分,大多数实现都支持它。

是的,您可以使用
承诺。所有
都可以等待多个承诺:

var fileRegister = [ 'fileA', 'fileB', 'fileC' ];

// returns a promise for a file
function loadFile(filename) {
    return new Promise(function (resolve, reject) {
        asyncLoadFile(filename, function (err, data) {
            if (err) {
                reject(err);
            }
            resolve(data);
        });
    });
}

Promise.all(fileRegister.map(loadFile))
    .then(function (files) {
        console.log("done");
    });

是的,您可以使用
Promise.all
等待多个承诺:

var fileRegister = [ 'fileA', 'fileB', 'fileC' ];

// returns a promise for a file
function loadFile(filename) {
    return new Promise(function (resolve, reject) {
        asyncLoadFile(filename, function (err, data) {
            if (err) {
                reject(err);
            }
            resolve(data);
        });
    });
}

Promise.all(fileRegister.map(loadFile))
    .then(function (files) {
        console.log("done");
    });

听起来您在寻找FYI,在数组元素上使用
delete
不会改变数组上的
.length
。它只是清除了该数组项。这是半个伪代码,我从未运行过。听起来像是在寻找仅供参考的信息,在数组元素上使用
delete
不会改变数组上的
。length
。它只是清除了数组项。这是半个伪代码,我从未运行过。谢谢你的回答,这对帮助我理解非常有用。谢谢你的回答,这对帮助我理解非常有用。