簡體   English   中英

承諾解決不等待其中的承諾

[英]Promise resolve not waiting for promise inside it

我試圖打個電話,更新列表,然后用更新后的列表解決諾言。

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()

該請求被發布,並且我能夠在測試欄中創建測試,但是resolve(tests)沒有newId分配。 這是我得到的輸出。 不確定為什么resolve不等待其余調用完成。

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

compareTestRailAndProtractor返回Promise 您可以在.then()使用async/awaitfor循環中的Promise構造函數來等待request回調,這在Question上的代碼中發出,因為for循環不等待回調函數

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

        for (var i = 0; i < testsLength; i++) {
          await new Promise((resolve, reject) => {
              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) {
                    reject(err);
                  }
                  newId = body.id;
                  tests.tests[i].id = newId;
                  resolve();
                });

              } else {
                resolve()
              }    
          });
      }
      return tests
    })
}

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

test()

我認為這是因為Javascript具有非阻塞性。 問題是在您的“ post”事件得到響應之前(即從中獲取ID的事件),將執行“ resolve(test)”。

我建議您看一下https://caolan.github.io/async/異步是一個處理異步過程的出色庫。

祝好運!

編輯:您也可以看看異步/等待 JS運算符

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM