如何等待异步函数返回?

时间:2016-06-14 07:21:24

标签: javascript angularjs facebook asynchronous

我正在使用AngularJS使用Facebook Graph API。它有一个名为FB.api();的函数,它返回一个包含一些数据的响应对象。但是,这是一个异步功能。我想知道在继续使用脚本的其余部分之前如何等待此函数返回。

请考虑以下代码:

var data = [];
FB.api('/' + response.data[i].id + '/tags', 'GET', {}, function(response) {
for(var j = 0; j < response.data.length; j++) {
    var friend = {
        id: response.data[j].id,
        name: response.data[j].name
    };

    FB.api('/' + response.data[j].id + '/picture?width=200&height=200', 'GET', function(response) {
        friend.url = response.data.url;
    });

    $timeout(function() {
        data.push(friend);
    }, 3000);
}

});

我正在尝试构建一个返回对象列表的函数。我遍历数据并保存对象中需要的数据。在循环内部,我正在再次调用异步API函数来获取一些额外的数据。但是,此函数不会立即返回,因此数据response.data.url永远不会保存在friend对象中。

我使用Angular的&timeout服务来模拟等待此函数返回;然而,这似乎是一种非常黑客的技术。有没有什么办法可以在执行其余脚本之前等待所有函数返回?

如果可能,请尝试建议代码示例。

2 个答案:

答案 0 :(得分:1)

您可能会看到以下链接,我认为这与您的问题类似

Is there a possible way implementing Promise inside angular.foreach?

答案 1 :(得分:0)

你应该使用async.each()而不是for()因为for()不要在这里等待callback():https://www.npmjs.com/package/async#each