使用JavaScript Trello API链接承诺

时间:2016-10-11 21:05:12

标签: javascript arrays api promise trello

我正在尝试使用JavaScript Trello API编译一张卡片列表,这些卡片可以来自任何列在任何名单中的用户板,名称为#34; todo"。

我成功地从所有名单中获得了一系列名单" todo"

...

}).then(function(list_data) {

        console.log("List Data", list_data);
        console.log("List Data Length", list_data.length);

        var cards_arr = [];

        $.each(list_data, function(index, value) {

            Trello.get("/lists/" + value.id + "/cards?fields=name,shortUrl")
            .then(function(cards) {

                $.each(cards, function(index, card) {
                    cards_arr.push(card.id);
                })

            })

        })

        console.log("Cards Array", cards_arr);

        return cards_arr;

    })

当我查看控制台日志时,它会显示我的" list_data"变量我得到一个包含6个项目的数组,但由于某种原因,数组的长度等于0并且不允许我遍历"空"阵列。

Console Log SnapShot

我觉得我可能没有以最有效的方式使用Trello API,因此我将继续发布以下完整代码。

非常感谢任何帮助。感谢

    var boards_arr = [];

    // ==== LOOP THROUGH BOARDS
    Trello.get("/member/me/boards?fields=name,id,idOrganization")
    .then(function(boards) {

        $.each(boards, function(index, board) {
            if (board.idOrganization != "5112df8dad3201247401349e") return;
            boards_arr.push(board.id);
        });

        return boards_arr;

    }).then(function(board_data) {

        var lists_arr = [];

        console.log("Board Data", board_data);

        $.each(board_data, function(index, value) {

            Trello.get("/boards/" + value + "/lists?fields=id,name")
            .then(function(lists) {

                $.each(lists, function(index, list) {

                    var listName = list.name.replace(" ", "").toLowerCase();
                    if (listName != "todo") return;

                    lists_arr.push(list.id);
                });

            });

        });

        return lists_arr;

    }).then(function(list_data) {

        console.log("List Data", list_data);
        console.log("List Data Length", list_data.length);

        var cards_arr = [];

        $.each(list_data, function(index, value) {

            Trello.get("/lists/" + value.id + "/cards?fields=name,shortUrl")
            .then(function(cards) {

                $.each(cards, function(index, card) {
                    cards_arr.push(card.id);
                })

            })

        })

        console.log("Cards Array", cards_arr);

        return cards_arr;

    })

1 个答案:

答案 0 :(得分:1)

由于您正在Trello.get回调中运行异步操作($.each),因此在这些元素完成之后,元素将不会被添加到数组中,这是之后 $.each返回。因此,当您致电console.log(cards_arr)时,尚未添加任何元素。

您应该做的是将Trello.get中的承诺存储在数组中,然后调用Promise.all等待所有内容完成,然后你获得所有结果后构建cards_arr数组。由于这会分离异步和同步操作,因此您可以确保在之后调用console.log时,cards_arr实际上已完成。

promise
  .then(function(list_data) {
    console.log("List Data", list_data);
    console.log("List Data Length", list_data.length);

    // do all operations and store results in an array
    var resultPromises = list_data.map(function(value) {
      return Trello.get("/lists/" + value.id + "/cards?fields=name,shortUrl")
    });

    // wait for all operations to complete
    return Promise.all(resultPromises);
  })
  .then(function(results) {
    // create cards_arr from results
    var cards_arr = [];
    $.each(results, function(index, cards) {
      $.each(cards, function(index, card) {
        cards_arr.push(card.id);
      });
    });

    // this should print the correct array
    console.log("Cards Array", cards_arr);

    return cards_arr;
  })