我有一个绝对正常的功能。我只想根据承诺返回真或假。
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。这个功能已经在我的工厂中使用了一个承诺。我不想让事情过于复杂,但对我来说重要的是这个函数返回一个布尔值,所以基于此,我可以相应地采取行动。
答案 0 :(得分:6)
编辑:对于ES2017 如果您的幸运者之一使用ES2017,那么您可以使用新的await/async关键字。它们非常出色,允许您编写读取同步的异步代码。 (它仍然是承诺,只是拆箱)。
function isOnline() {
return Promise.resolve(true);
}
async function Main() {
const online = await isOnline();
console.log(online);
}
Main();
因为它是异步的。在您的承诺解决之前,您的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;
}