javascript - 如何检查 promise 返回值并在angularjs中采取行动?

标签 javascript angularjs promise

我想通过点击公共(public)云上的像素来检查互联网连接。根据响应,无论用户是否连接到 Internet,我都想显示一个警报。以下是像素加载的代码(在服务中注入(inject)$q,具有以下功能):

  hasInternetConnection = function(pingUrl){
var img,
  pingUrl = Constant.ImageUrl;

var deferred = $q.defer();

img = document.createElement('img');
img.onerror = deferred.reject(false);
img.onload = deferred.resolve(true)
img.src = pingUrl;

return deferred.promise
}

现在根据它的返回值我想做以下事情:

var con = hasInternetConnection()
if(!con){
  alert('No connection')
}

但这行不通。有什么建议吗?

如何在单元测试中测试警报弹出窗口?

谢谢。

最佳答案

您对如何使用 promise 执行此任务甚至如何为图像分配回调的理解都存在很多错误。

这是您的函数的清理版本:

function hasInternetConnection() {
    var timer, timeoutTime = 4000;
    var defer = $q.defer();

    var img = new Image();
    img.onload = function() {
        clearTimeout(timer);
        defer.resolve(true);
    }
    img.onerror = img.onabort = function() {
        defer.resolve(false);
    }
    img.src = Constant.ImageUrl + "?rand=" + 
        (Math.random() + "").replace(".", "") + "_" + (new Date().getTime());

    // set max time to wait
    timer = setTimeout(img.onerror, timeoutTime);
    return defer.promise;    
}

hasInternetConnection().then(function(connected) {
    if (connected) {
        // have internet here
    } else {
        // no internet here
    }
});

工作演示:http://jsfiddle.net/jfriend00/2xr4rzqq/

更改/修复摘要:

  1. 将缓存破坏值添加到 URL,这样您就不会不小心从缓存中获取图像。
  2. 将 promise 的使用更改为 .then() 处理程序。
  3. onerroronload正确赋值给实际的函数引用,以后可以调用。
  4. 添加超时,因为系统超时未知,这样您就可以更好地控制等待时间。
  5. 将两个解决方案更改为使用 .resolve(),因为对于调用者来说,只检查 promise 值 bool 值而不是使用两个处理程序似乎更容易。这纯粹是一种设计选择。
  6. 删除 pingUrl 参数,因为您没有使用该参数
  7. 使用 new Image() 代替 document.createElement("img")
  8. 包含 onabort 处理程序以确保完整性。

关于javascript - 如何检查 promise 返回值并在angularjs中采取行动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25375823/

相关文章:

javascript - 为什么不允许此操作

java - 使用 Java 或 Javascript 对社交网站进行图像处理

javascript - 如何设置选项 Angular 默认值

javascript - 如何检查网络应用程序是否首次在 AngularJS 的浏览器上运行?

javascript - 基本的 highcharts 插件,需要删除点之间的线

javascript - 如何在使用 ng-include 加载部分内容之前解决 XHR 请求

reactjs - 无法使用 axios 读取未定义的属性 `.then` 并在操作中使用react

javascript - 从 Promise(then) 返回值

javascript - 让所有功能异步的任何缺点?

javascript - 如何使 <div> 标签内的元素一次消失一个