在javascript中按顺序执行功能?

时间:2015-09-16 07:02:31

标签: javascript jquery angularjs function

我正在使用javascript编写这段代码

preDefineListName = ['Applied', 'Test taken', 'SWS Interview', 'Candidate', 'Rejected'];

for (var i = 0; i < preDefineListName.length; i++) {
      Trello.addList(data.id, preDefineListName[i]);
};

Trello.addList = function (trelloBoardId, listName) {
    return $http.post('https://api.trello.com/1/lists', {
        idBoard: trelloBoardId,
        name: listName,
        key: trelloKey,
        token: trelloToken
    });
};

现在,for循环中的函数Trello.addList在trello.com上创建了一个列表,其中包含preDefineListName中的给定名称。问题是列表在传递时没有按顺序出现。

我应该怎样做才能使其按正确顺序排列。我要在循环中调用函数,所以我无法改变它。

2 个答案:

答案 0 :(得分:1)

您的Trello.addList返回Promise并且是异步的(因为它执行http调用)。因此,您需要一个异步循环而不是for循环。这将是.forEach列表上的preDefineListName来电。

您也可以使用.map,这样您就可以返回Trello.addList调用的结果,然后使用$q.all等待所有addList调用完成:

$q.all(preDefineListName.map(function(name) {
    return Trello.addList(data.id, name);
})).then(function success(results) {
    // do something with the results
}, function error(reasons) {
    // handle errors here
});

答案 1 :(得分:0)

使用promises和recursion。看起来有点hacky,但会使事情同步:

preDefineListName = ['Applied', 'Test taken', 'SWS Interview', 'Candidate', 'Rejected'];

Trello.addList(data.id, preDefinedListName); // Initiate list adding

Trello.addList = function(trelloBoardId, listNames) {
   if(!listNames.length) {
      return;
   }

   var listName = listNames[0];
   listNames.splice(0, 1); // Remove first element from array

   $http.post('https://api.trello.com/1/lists', {
        idBoard: trelloBoardId,
        name: listName,
        key: trelloKey,
        token: trelloToken
   }).then(function(response) {
       Trello.addList(trelloBoardId, listNames); // Call the function again after this request has finished.
   });
}