Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 完成$。时调用函数_Javascript - Fatal编程技术网

Javascript 完成$。时调用函数

Javascript 完成$。时调用函数,javascript,Javascript,如果我在Chrome控制台中运行showFriends()函数,我可以看到数据。但是在代码中,我在$之后调用showFriends()。每个函数都失败,因为它似乎是异步运行的 我尝试在$之后链接.promise().done(showFriends();每个函数,但也失败了 有什么想法吗 var myApp = {}; myApp.fbFriends = []; function showFriends() { console.log(myApp.fbFriends); } functi

如果我在Chrome控制台中运行showFriends()函数,我可以看到数据。但是在代码中,我在$之后调用showFriends()。每个函数都失败,因为它似乎是异步运行的

我尝试在$之后链接.promise().done(showFriends();每个函数,但也失败了

有什么想法吗

var myApp = {};
myApp.fbFriends = [];

function showFriends() {
  console.log(myApp.fbFriends);
}

function getFriends() {

  FB.api('/me/friends?fields=birthday', function(response) {
    var friendsBirthdays = response.data;
    friendsIdArray = friendsBirthdays.map(function(user) { return user.id });
    createFriendsArray(friendsIdArray);
  });

  function createFriendsArray(friendsIdArray) {

    $.each(friendsIdArray, function(index, value) {
      FB.api(value.toString(), function(response) {
        myApp.fbFriends.push(response);
      });
    });
    showFriends();
  }
}

如果没有其他内容,您可以在每次推送后比较FriendArray和myApp.fbFriends的长度,如果它们相同且大于零,请运行
showFriends()
。这将确保在最后一次迭代后显示朋友

比如说:

$.each(friendsIdArray, function(index, value) {
  FB.api(value.toString(), function(response) {
    myApp.fbFriends.push(response);
    if (myApp.fbFriends.length == friendsIdArray.length)
      showFriends();
  });
});

每个
都不是异步的,
FB.api
调用可能是异步的。您也可以使用
done()
jquery@rockStar:应该怎么做?在调用
.done
之前,您需要一个承诺。这将是
.promise().done(//此处的函数)
@rockStar:那么你在哪里调用
.promise
呢?还有,你读过OP写的吗?“我试过在$之后链接.promise()。完成了[…]。每个函数都失败了”如果你能提供一个完整的例子,你就说服了我。+1我想建议延迟对象/承诺,但这会减少很多开销。承诺在以后可以很好地解耦代码。是的,对于像这样简单的事情,比较长度是可以的……但是对于任何复杂的事情,我都会同意承诺。谢谢!谢谢!Ps:实际上是w我要做的就是像showFriends(response)一样传递响应,这样我就可以显示可用的朋友。