2

ページに 5 つのリンクがあり、すべてのリンクが機能しているかどうかを確認する必要があります。ここにコードがあります

 // iterate through each link and check if ti works.
 for(var i=0; i < 5; i++) {
    var ifLinkWorks = verifyLinkWorks(links[i]);
    if(ifLinkWorks){  OK  }
    else{ error }
 }

これがverifyLinkWorksの機能です。リンクが開きます。開いた後、ページが正しくロードされているかどうかを確認します

        function verifyLinkWorks(link) {
          return winjs.Promise(function(complete) {          
          link.click();  
          // wait for page to load
          return winjs.promise.timeout(4000).then(function () {
            // check if page is loaded
            var islinkOK = IsPageLoaded();
            complete(islinkOK); // i want verifyLinkWorks to return this value
            });
         });
    }

link.click() に到達した後、ページがロードされるのを待っていません。代わりに、外側の for ループの if 条件にジャンプします (linkWorks = undefined になるため、エラーが発生します)。verfifyLinkWorks関数で待機させる方法。前もって感謝します...

4

2 に答える 2

1

一度に、または個別に、各 promise の結果を待つ必要があります。アクションは本質的にすべて非同期であるため、コードは待機できませんが、すべての作業が完了すると関数を呼び出すことができます。

Promiseここでは、各インスタンスを保持する配列を作成しました。ループが完了すると、コードはすべてが完了するまで待機し、渡された配列を使用して、各インデックスで結果をチェックします。

// iterate through each link and check if it works.
var verifyPromises = [];
for(var i=0; i < 5; i++) {
   verifyPromises.push(verifyLinkWorks(links[i]));
}

WinJS.Promise.join(verifyPromise).done(function(results) {
    for(var i=0; i < 5; i++) {
        var ifLinkWorks = results[i];
        if (ifLinkWorks) {  /* OK */  }
        else { /* error */ }
    }
});

呼び出しが失敗した場合に備えて、 /ブロックlink.click()でラップしました。trycatch

function verifyLinkWorks(link) {
     return WinJS.Promise(function(complete, error) {          
          try {
              link.click();  
          } catch (e) {
              complete(false);  // or call the error callback ...
          }
          // wait for page to load, just wait .. no need to return anything
          WinJS.Promise.timeout(4000).then(function () {
              // check if page is loaded
              var islinkOK = IsPageLoaded();
              // finally, call the outer promise callback, complete
              complete(islinkOK); 
          });
     });
}

URL の有効性を確認したい場合は、WinJS.xhrメソッドを使用してHEADリクエストを実行することを検討することをお勧めします ( rfc )。各link変数を使用しtimeoutて、ページ全体をダウンロードする (または に切り替えてGET応答本文を確認する) ことなく、URL に適切な応答があることを検証できます。

WinJS.Promise.timeout(4000, 
    WinJS.xhr({
        type: 'HEAD',
        url: link
    }).then(function complete(result) {
        var headers = result.getAllResponseHeaders();

    }, function error(err) {
        if (err['name'] === 'Canceled') {

        }
        if (err.statusText) {

        }
    })
);  
于 2013-09-09T19:51:15.613 に答える
0

win js promise オブジェクトの msdn コード サンプルへのリンクはこちらです。

お約束

コードを実行する

<button id="start">StartAsync</button>
<div id="result" style="background-color: blue"></div>

<script type="text/javascript">

WinJS.Application.onready = function (ev) {
    document.getElementById("start").addEventListener("click", onClicked, false);
};

function onClicked() {
    addAsync(3, 4).then(
        function complete(res) {
             document.getElementById("result").textContent = "Complete";
        },
         function error(res) {
             document.getElementById("result").textContent = "Error";
        },
         function progress(res) {
             document.getElementById("result").textContent = "Progress";
      })

 }
function addAsync(l, r) {
     return new WinJS.Promise(function (comp, err, prog) {
        setTimeout(function () {
            try {
                var sum = l + r;
                 var i;
                 for (i = 1; i < 100; i++) {
                     prog(i);
                }
                     comp(sum);
                }
                catch (e) {
                    err(e);
                }
            }, 1000);
        });
    }
</script>

addAsync(3,4).then()関数が表示されます。したがって、応答を遅らせるために、すべてのコードをその関数内に保持する必要があります。申し訳ありませんが、タブを使用しているため、適切に書き込むことができません。

また、winjsの約束のためにリンクを通過してください

于 2013-09-09T15:31:53.033 に答える