【问题标题】:How to create a AngularJS promise from a callback-based API如何从基于回调的 API 创建 AngularJS 承诺
【发布时间】:2017-03-30 15:15:44
【问题描述】:

wifiservice.js:

angular.module('app.WifiServices', [])
    .factory('WifiService', function(){
        var unique_array = angular.fromJson('[]');

        function win_wifi(e){
        alert("Success");
        }

        function fail_wifi(e){
        alert("Error");
        }

        function connectWifi(wifi_ssid){
          WifiWizard.connectNetwork(wifi_ssid, win_wifi, fail_wifi);
        }

        function listHandler(a){

      var network_array = [];
      for(var i=0; i<a.length; i++){
        network_array.push("SSID: " + a[i].SSID + " Signal: " + a[i].level);
      }

      unique_array = network_array.filter(function(elem, pos) {
        return network_array.indexOf(elem) == pos;
      });

      // alert("Wifi List Ready!");
    }

    function getScanResult(){
      WifiWizard.getScanResults(listHandler, failNetwork);
    }

    function successNetwork(e){
      window.setTimeout(function(){
        getScanResult();
      }, 3000);
    }

    function failNetwork(e){
      alert("Network Failure: " + e);
    }

    window.setTimeout(function(){
      WifiWizard.startScan(successNetwork, failNetwork);
    }, 1000);

        return {
          list: function(){
            return unique_array;
          },

          connectionToWifi: function(name){
            connectWifi(name);
          }
        };
    });

我的整个控制器:

app.controller('WifiController', ['$scope', 'WifiService', function($scope, WifiService) {

 $scope.wifiList = [];

 window.setTimeout(function() {
  $scope.wifiList = WifiService.list();
  // alert($scope.wifiList);
  $scope.$apply();
 }, 5000);

 $scope.getList = function() {
  $scope.wifiList = WifiService.list();
  return $scope.wifiList;
 }

 $scope.connectWifi = function(name) {
  WifiService.connectionToWifi(name);
 }

 $scope.checkin = function() {
  $scope.getList()
  .then(function(result) {
     console.log(result);
 });
}

}]);

我要做的是调用 $scope.getList(),它返回周围 wifi SSID 的列表,然后在 $scope.checkin() 中处理这些数据。

由于扫描需要一些时间,我必须等待 getList 函数完成,这就是我尝试使用 .then 的原因,但它给了我标题上所说的错误。有什么想法吗?

【问题讨论】:

  • 你需要返回有承诺的东西!另一种使用 .success 代替!
  • @Tushar 是对的,但请记住 .success 已弃用!
  • 除非 WifiService.list() 有阻塞操作,这里没有理由使用 Promise。我们可以看看这个函数是什么样子的吗?
  • @lealceldeiro 正确,但这完全取决于WifiService.list()。在它是一个 http 请求之前,不要看到任何承诺点
  • 查看您的代码,我认为这将有助于您更好地理解:codingeek.com/angularjs/… 它确实帮助我理解何时使用(或不使用)scope.apply()。

标签: angularjs angular-promise


【解决方案1】:

如何从基于回调的 API 创建 AngularJS 承诺

要从基于回调的 API(例如 WifiWizard.connectNetwork)创建 AngularJS 承诺,请使用 $q.defer

function connectWifi(wifi_ssid) {
   var future = $q.defer();
   var win_wifi = future.resolve;
   var fail_wifi = future.reject;
   WifiWizard.connectNetwork(wifi_ssid, win_wifi, fail_wifi);
   return future.promise;       
};

上面的示例返回一个$q Service 承诺,该承诺使用来自 API 的回调来解决或拒绝。

【讨论】:

    【解决方案2】:

    好吧,我想出了一些不同的东西:

    var unique_array = [];
      $scope.wifiList = [];
      $ionicLoading.show({
        template: "Scanning surrounding AP's..."
      });
    
     window.setTimeout(function() {
      $scope.wifiList = WifiService.list();
      // alert($scope.wifiList);
      while ($scope.wifiList == []) {
        console.log('Scanning...');
      }
      $scope.$apply();
      $ionicLoading.hide();
     }, 5000);
    

    我意识到,一旦我加载视图,扫描就会开始。因此,我添加了一个 IonicLoader 来强制用户等待,并且在扫描完成之前无法按下任何按钮。因此,任何功能都不应相互等待。在代码方面不太正确,但它可以满足我的需要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-27
      • 2013-09-15
      • 1970-01-01
      • 2017-04-26
      • 2013-07-22
      • 1970-01-01
      相关资源
      最近更新 更多