使用 FB.api 异步调用 jQuery.when() 时出现变量问题

使用 FB.api 异步调用 jQuery.when() 时出现变量问题

尝试将多次调用 FB 的数据放入一个数组中,并在准备就绪时对其进行操作。不幸的是。脚本等待响应,但无论如何我以后都无法访问它。

    var xxx = 0; // Counter to check
    var friendsRequest = []; // Array to catch all calls and execute the code when all responses are back
    var friends = ['...','...']; // array of friend id's

    for (var i = 0; i < friends.length; i++) {
        var friend = friends[i]; // Go through number of FB friends (doesn't matter)

        // Here we save all calls to wait for result
        friendsRequest[friend] = FB.api('/' + friend + '/picture?redirect=0&height=64&type=square&width=64', function(response) {
            xxx++; // Try to increment the counter
            console.log(xxx); // Works fine.
        });
    }

    // Execute the code when all data collected.
    // It executes correctly __after__ last FB.api() async call ends
    $.when(friendsRequest).then(function(){
        console.log(xxx); // But here we have always "0"
    });

也许 $.when 无法与多个 FB.api() 调用配合使用?您知道哪里出了问题吗?

答案1

这里有多个错误:

1)数组不应该像这样迭代:

for(i in ['...','...'])

当您执行此操作时,i将是数组中的索引,而不是数组中的项。并且,它将迭代对象的属性,有时这些属性可能不仅仅是数组元素。您应该使用以下任一方法迭代数组元素:

for (var i = 0; i < array.length; i++) {
    // process array[i]
}

或者.forEach()

array.forEach(function(item, index) {
    // process item here
});

2)我自己不知道 FB api,但我没有看到任何FB.api()返回承诺的文档。 $.when()仅适用于承诺。

3)当您在 中累积项目时friendsRequest,您正在构建一个对象,而不是一个数组。假设friend.id是一个字符串,friendsRequest[friend.id]则设置对象的属性,而不是数组元素。

4)如果您想要使用实际数组$.when()(在您修复其他内容以实际拥有一个数组之后),$.when()则预计会像这样调用:

$.when(p1, p2, p3, p4)

其中 p1 ... p4 是承诺。因此,如果您有一个承诺数组,那么您可以$.when()通过执行以下操作以适当的方式调用:

$.when.apply($, arrayOfPromises)

相关内容