在承诺解决/拒绝后返回布尔值?

时间:2015-10-20 07:12:57

标签: angularjs ionic-framework ionic angular-promise

我有一个绝对正常的功能。我只想根据承诺返回真或假。

template <typename function,
      template <typename...> class collection,
      typename in_type,
      typename... types,
      typename out_type = 
        typename std::result_of<function(in_type)>::type>
static collection<out_type> pmap(
  const function& f, const collection<in_type, types...>&& c)  {
  collection<out_type> result;
  if(!c.empty())  {
    if(typeid(in_type)==typeid(out_type))  {
      __gnu_parallel::transform(c.begin(),c.end(),c.begin(),f);
      result = c;
    }
    else  {
      result = collection<out_type>(c.size());
      __gnu_parallel::transform(c.cbegin(),c.cend(),result.begin(),f);
    }
  }
  return std::move(result);
}

但是当我调用这个函数时,

 //I want this function to return a simple true or false!!!
function isAppOnline() {
            var is_connected = connectivityMonitor.isInternetConnected();
            is_connected.then(function(result) {
                console.log('INTERNET_CHECK_API : app online');//works fine
                return true;//this is not being returned
            }, function(error) {
                console.log('INTERNET_CHECK_API : app offline');//works fine
                return false;//this is not being returned
            });
        }

is_online 始终为 未定义 。为什么函数不能返回一个简单的布尔值?

更新:

这就是我想要做的: 我只想打开一个弹出窗口,通知用户他已离线。我在10secs之后定期调用函数isAppOnline。这个功能已经在我的工厂中使用了一个承诺。我不想让事情过于复杂,但对我来说重要的是这个函数返回一个布尔值,所以基于此,我可以相应地采取行动。

4 个答案:

答案 0 :(得分:6)

编辑:对于ES2017 如果您的幸运者之一使用ES2017,那么您可以使用新的await/async关键字。它们非常出色,允许您编写读取同步的异步代码。 (它仍然是承诺,只是拆箱)。

function isOnline() {
    return Promise.resolve(true);
}

async function Main() {
    const online = await isOnline();

  console.log(online);
}

Main();

fidle

因为它是异步的。在您的承诺解决之前,您的isAppOnline方法会返回。

我认为正在进行某种形式的AJAX调用以检查网络连接,因此必须等待它响应。 JavaScript是单线程的,如果该线程被锁定等待该请求响应,那么它可以是同步的,整个JavaScript将暂停直到它返回。不好。

因此,如果您希望isAppOnline的来电者知道您必须选择的结果。要么传回一个回叫,要么返回承诺(更好的选择)

function isAppOnline(cb) {
    var is_connected = connectivityMonitor.isInternetConnected();
    is_connected.then(function(result) {
        console.log('INTERNET_CHECK_API : app online');//works fine
        cb(true);
    }, function(error) {
        console.log('INTERNET_CHECK_API : app offline');//works fine
        cb(false);
    });
}

//better option
function isAppOnline() {
    return connectivityMonitor.isInternetConnected().then(function(result) {
        console.log('INTERNET_CHECK_API : app online');//works fine
        return true;
    }, function(error) {
        console.log('INTERNET_CHECK_API : app offline');//works fine
        return false;
    });
}

//used as
isAppOnline().then(function (isOnline) {
    console.log('Is it online?', isOnline);
});

答案 1 :(得分:1)

Promise与简单语句的工作方式不同,因为它们可能会在以后返回,因此您可能需要重新考虑程序流以处理不同的初始和最终状态。

function isAppOnline() {
    var is_connected = connectivityMonitor.isInternetConnected();
    return is_connected.then(function(result) { // add return here to return the whole promise
        console.log('INTERNET_CHECK_API : app online');//works fine
        return; //this will resolve the promise returned
    }, function(error) {
        console.log('INTERNET_CHECK_API : app offline');//works fine
        $q.reject(); // this will reject the promise returned
    });
}

您必须处理调用控制器中的更改状态(短时间内可能为false,然后变为true等)。您可以考虑使用加载状态来防止误导用户。

is_online = false;
isLoading = true;

isAppOnline().then(function() {
    is_online = true;
}, function() {
    is_online = false;
})
.finally(function(){
    isLoading = false;
});

答案 2 :(得分:0)

您的问题表明需要进一步探索Javascript的异步处理。我建议阅读:How do I return the response from an asynchronous call?

你可以实现强制方法同步返回的黑客攻击,但是角度的构建方式几乎无处不在。如果你能给我们一些关于你想要实现的目标的更多背景信息,我们可以帮助你以一种利用承诺本身的方式编写你的代码。

答案 3 :(得分:-1)

您可以尝试以下操作(这是未经测试的代码,因为您没有提供工作脚本):

function isAppOnline() {
    var defer = $q.defer();

    var is_connected = connectivityMonitor.isInternetConnected();
    is_connected.then(function(result) {
        console.log('INTERNET_CHECK_API : app online');//works fine
        defer.resolve(true);
    }, function(error) {
        console.log('INTERNET_CHECK_API : app offline');//works fine
        defer.resolve(false);
    });

    return defer.promise;
}

并称之为:

var is_online = false;
isAppOnline().then(function(data){
    is_online = data;
});

或者,直接传递is_connected对象,而不是更好地进行错误处理:

function isAppOnline() {
    var defer = $q.defer();

    var is_connected = connectivityMonitor.isInternetConnected();
    is_connected.then(function(result) {
        console.log('INTERNET_CHECK_API : app online');//works fine
        defer.resolve(is_connected);
    }, function(error) {
        console.log('INTERNET_CHECK_API : app offline');//works fine
        defer.reject();
    });

    return defer.promise;
}