承诺解决不等待它内部的承诺

时间:2017-10-08 00:30:25

标签: javascript node.js promise request

我正在尝试进行休息调用并更新列表,然后使用更新的列表解析承诺。

function addTestCaseToTestRail(){
    return new Promise(function(resolve){
        compareTestRailAndProtractor().then(function(tests){
            var testsLength = tests.tests.length;
            var url = testRailURL+testRailData.addTestEndPoint;

            for(var i=0; i<testsLength; i++){
                if(tests.tests[i].id==undefined){
                    var newId=""
                    var options = {
                        url:url,
                        headers:headers,
                        body:{
                            "title":tests.tests[i].name,
                            "custom_jira_component" : 465
                        },
                        json: true
                    }
                    request.post(options, function(err, httpResponse, body){
                        if (err) {
                            console.error(err);
                            return;
                        }
                        newId = body.id;
                    });
                    tests.tests[i].id = newId;
                }
            }
            resolve(tests);
        });
    });
}

function test(){
    addTestCaseToTestRail().then(function(tests){
        console.log(tests);
    });
}

test()

请求已发布,我可以在测试轨道中创建测试,但解决方案(测试)没有newId分配。 这是我得到的输出。不确定为什么resolve不会等待其余的调用完成。

{ tests: 
    [ { id: '', name: 'test1'},
      { id: '', name: 'test2'},
      { id: '', name: 'test3'},
      { id: '', name: 'test4'},
      { id: '', name: 'test6'},
      { id: '', name: 'test5'} ] }

2 个答案:

答案 0 :(得分:1)

compareTestRailAndProtractor返回Promise。您可以使用async/await中的.then()Promise循环中的for构造函数来等待request回调,这是问题代码中的问题,为{{1循环不等待回调函数

for

答案 1 :(得分:-1)

我认为这是因为Javascript的非阻塞特性。问题是&#34;解决(测试)&#34;在你的&#34; post&#34;之前执行event有一个响应(你从中获取Id)。

我建议你看看https://caolan.github.io/async/ Async是一个用于处理异步进程的神奇库。

祝你好运!

编辑:您还可以查看async/await JS运营商