【问题标题】:Can promises be used to trigger a bunch of async loads?可以使用 Promise 来触发一堆异步加载吗?
【发布时间】:2015-12-03 00:00:10
【问题描述】:

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

是否可以使用 Promise 并保持异步行为,然后在它们全部完成后使用 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');
    }
  });
}

【问题讨论】:

  • 听起来你在找Promise.all
  • 仅供参考,在数组元素上使用delete 不会更改数组上的.length。它只是清除该数组条目。
  • 它是半伪代码,我从来没有运行过。

标签: javascript node.js promise q


【解决方案1】:

是的,您可以使用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");
    });

【讨论】:

    【解决方案2】:

    我真的很惊讶,网站上似乎没有对此的权威答案。是的,你可以创建一堆 Promise(每个都包装一个异步操作),然后调用 Promise,所有这些都会在它们全部完成后解决:

    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^ 规范的一部分,大多数实现都支持。

    【讨论】:

    • 感谢您的回答,对我的理解很有帮助。
    猜你喜欢
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 2015-10-21
    • 2011-10-31
    • 1970-01-01
    相关资源
    最近更新 更多