javascript - 如何在 vanilla javascript 中将 promise 链接到 for 循环中

标签 javascript promise es6-promise

如果我正在执行如下所示的异步调用,如何将它们与 promises 链接起来,以便我可以按顺序执行操作?在此示例中,最终发生的是 arr 会将项目打乱。我更喜欢有 promise 的答案,但只要有效,任何事情都可以

var fbArrOfAlbumNames = ['Profile Pictures', 'Cover Photos', 'Mobile Uploads'];
var arr = [];
for(var x = 0; x < fbArrOfAlbumNames.length; x++) {
  (function(cntr) {
    FB.api('/' + fbArrOfAlbumNames[cntr] + '/photos/', {fields: 'picture,album'}, function(response) {
      arr.push(response);
    }
  })(x);
}

最佳答案

假设您的 ajax 调用实际上可以并行运行并且您只想按顺序获得结果,那么您可以 promise ajax 函数并使用 Promise.all() 来按顺序获取所有结果:

// promisify the ajax call
function fbAPIPromise(path, args) {
    return new Promise(function(resolve, reject) {
        FB.api(path, args, function(results) {
            if (!result) return resolve(null);
            if (result.error) return reject(result.error);
            resolve(result);
        });
    });
}

var promises = [];
for (var x = 0; x < 10; x++) {
     promises.push(fbAPIPromise('/' + fbArrOfAlbumNames[x] + '/photos/', {fields: 'picture,album'});
}
Promise.all(promises).then(function(results) {
     // results is an array of results in original order
}).catch(function(err) {
     // an error occurred
});

关于javascript - 如何在 vanilla javascript 中将 promise 链接到 for 循环中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43130019/

相关文章:

javascript - jquery 使用 Promise 和反向地理编码获取用户位置

javascript - 在 Jquery UL li 过滤器中更改链接颜色

php - 如何在输入ONFOCUS 之外显示文本?

coffeescript - $q defer 和 Promise 以及如何使用它们在渲染 View 之前为 Controller 加载数据

javascript - Protractor 和 promise

javascript - 测试捕获 Promise 错误

javascript - 我正在尝试从 javascript 加载一个弹出窗口,它可以工作,但是,当我单击关闭弹出窗口时,没有任何反应

javascript - 在 Node.js 中 trim 和连接音频文件

javascript - (Nodejs + Restify)发送后无法设置标题 - promise 拒绝警告

javascript - 什么是显式 promise 构造反模式以及如何避免它?