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()调用失败,我将其包装在try/catch块中:

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变量,您可以使用 atimeout来验证 URL 是否有合理的响应,而无需下载整个页面(或切换到 aGET并检查响应正文)。

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 代码示例的链接。

承诺winjs

现在通过代码

<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 回答