javascript - 如何使用异步代码在 forEach 循环上进行 promise /回调

标签 javascript asynchronous promise

我认为我正在寻找 promise ,但我不知道如何在我的案例中使用它。
我想 console.log('ended') 只有当我所有的异步代码都完成时。
我有一个 DZ.api 的回调,但没有 forEach() ,最好的方法是什么?

    _.forEach(filteredTracks, function(n) {
        DZ.api('/playlist/'+ n.id +'/tracks', function(response) {
            _.forEach(response.data, function(n) {
                SP.api('/search/'+n.title, function(response) {
                    console.log(response);
                });
            });
        });
    });
    console.log('ended');

最佳答案

您正在寻找 Promise.all -> Promise.all(arrayOfPromise).then(function (result) {})

使用您当前的代码,如果 SP.api 已经与 Promise 兼容,只需执行以下操作:

_.map(filteredTracks, function(n) {
    return DZ.api('/playlist/'+ n.id +'/tracks')
            .then(function (response) {
                _.map(response.data, function(n) {
                    return SP.api('/search/'+n.title);
                });

                return Promises.all(response.data);
            });
    });
});

Promise.all(filteredTracks)
    .then(function (results) {
        console.log('ended');
    });

如果 SP.api 和 DZ Api 没有返回 Promise,您可以:

Promisify SP.api DZ Api 和并且使用我之前写的相同代码

或者在 ._map 中返回 promises

_.map(filteredTracks, function(n) {
    var promise = new Promise(function (resolve, reject) {
        DZ.api('/playlist/'+ n.id +'/tracks', function (response) {
                _.map(response.data, function(n) {
                    var insidePromise = new Promise(function (resolve, reject) {
                        return SP.api('/search/'+n.title, function (result) {
                            resolve(result);
                        });
                    })

                    return insidePromise;
                });

                resolve(Promises.all(response.data));
            });
        });
    });

    return promise;
});

Promise.all(filteredTracks).then(function (results) {
        console.log('ended');
    });

关于javascript - 如何使用异步代码在 forEach 循环上进行 promise /回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32847857/

相关文章:

javascript - 用于动态添加输入字段的 keyup 函数

video - Node.js异步视频转换速度慢

javascript - 如何处理这些异步函数(设计模式?)

javascript - Javascript 异步函数的 'await' : generator's 'yield' vs. 'promise.then()' 的正确心理模型?

javascript - 如何从拉取的 mongodb 文档中添加字段

javascript - 如何使用reduce正确链接promise

javascript - 从 _.map() 返回对象

javascript - 如何使用自定义外观列表隐藏列表下拉列表中的选择占位符

javascript - 如何将 javascript 变量值分配给 HTML 属性?

java - RxJava : observable that contains an asynchronous call